우리 모두는 이것을 사용하여 tree
디렉토리 구조의 올바른 형식의 텍스트 "시각화"를 얻을 수 있다는 것을 알고 있습니다.
$ tree -spugD /usr/include/boost/accumulators/numeric/
/usr/include/boost/accumulators/numeric/
├── [drwxr-xr-x root root 4096 Dec 19 2011] detail
│ ├── [-rw-r--r-- root root 2681 Oct 21 2010] function1.hpp
│ ├── [-rw-r--r-- root root 406 Oct 21 2010] function2.hpp
│ ├── [-rw-r--r-- root root 409 Oct 21 2010] function3.hpp
│ ├── [-rw-r--r-- root root 409 Oct 21 2010] function4.hpp
│ ├── [-rw-r--r-- root root 6725 Oct 21 2010] function_n.hpp
│ └── [-rw-r--r-- root root 530 Oct 21 2010] pod_singleton.hpp
├── [drwxr-xr-x root root 4096 Dec 19 2011] functional
│ ├── [-rw-r--r-- root root 2316 Oct 21 2010] complex.hpp
│ ├── [-rw-r--r-- root root 16627 Oct 21 2010] valarray.hpp
│ └── [-rw-r--r-- root root 12219 Oct 21 2010] vector.hpp
├── [-rw-r--r-- root root 9473 Oct 21 2010] functional_fwd.hpp
└── [-rw-r--r-- root root 21312 Oct 21 2010] functional.hpp
2 directories, 11 files
내가 원하는 것은 그 반대입니다. 위의 내용이 포함된 텍스트 파일이 있으면 dirstruct.txt
다음과 같이 작성할 수 있습니다(의사).
$ reverse-tree dirstruct.txt -o /media/destpath
...따라서 /media/destpath
디렉터리가 존재하지 않으면 디렉터리가 생성되고 위의 트리에 따라 detail
파일 등이 포함된 function1.hpp
하위 폴더가 생성됩니다.
물론 언제든지 복사본을 만들어 cp -a
동일한 결과를 얻을 수 있습니다. 여기서의 아이디어는 텍스트 파일의 파일 이름, 디렉터리 이름, 크기, 권한 및 타임스탬프를 변경할 수 있다는 것입니다.저것출력 구조를 재구성합니다. 파일의 경우 처음에는 파일이 ed(즉, 크기가 0바이트)인 한 괜찮을 것이라고 생각했습니다 touch
. 하지만 요청된 크기가 될 때까지 0x00 또는 임의 바이트를 채워서 크기도 다시 작성하는 것이 더 나을 것이라고 생각했습니다. 도달했다.
주요 용도는 실제로 질문을 게시하는 것입니다 :)
. 그 중 일부는 내가 설치한 프로그램과 같은 디렉토리 구조에 의존하지만 프로그램 자체는 질문과 아무 관련이 없습니다. 그런 다음 간단히 "익명" 디렉토리에 대해 질문할 수 있습니다. 프로그램을 설치한 응답자는 트리 텍스트 설명을 게시물에 붙여넣기만 하면 자신의 컴퓨터에 해당 디렉토리 트리를 빠르게 다시 구축할 수 있습니다.
그렇다면 이를 달성하는 쉬운 방법이 있습니까?
답변1
저는 이런 도구를 본 적이 없습니다. Bash를 포함한 다양한 스크립팅 언어를 사용하여 스크립트를 작성하여 출력을 구문 분석 tree
하고 일치하는 디스크의 해당 디렉터리를 재구성할 수 있습니다. 텍스트 파일을 보려면 while
또는 for
루프를 사용하고 mkdir
또는 을 사용하여 mkdiir -p
디렉터리 또는 중첩된 디렉터리 구조를 만든 다음 해당 touch
명령을 사용하여 텍스트 파일 내에 빈 버전의 파일을 만들어야 합니다.
구조를 완전히 복사하려면 이후 관련 타임스탬프를 복사할 수도 mkdir
있으며 둘 다 이를 매개변수로 제공합니다.touch
답변2
이것이 다시 필요했을 때 이를 수행하기 위해 Perl 스크립트를 작성했습니다. 결과가 약간 복잡해서 여기에 게시합니다.
그것이 하는 일은 - 의 출력을 구문 분석하는 것이지만 tree
OP 예제와는 달리 옵션도 필요합니다 --dirsfirst
. 이 모든 것을 기억하지 않으려면 revrs-tree.pl
먼저 다음과 같이 사용할 수 있습니다.
perl revrs-tree.pl --getdir /usr/include/boost/accumulators/ > test.tree
... tree
올바른 옵션을 사용하여 간단히 호출하여 표준 출력으로 출력합니다. 이를 파일로 캡처합니다 test.tree
.
그런 다음 this 의 내용에 대해 동일한 스크립트를 호출 test.tree
하지만, 출력은 디렉터리/파일 자체가 아니라 bash
표준 출력으로 인쇄되는 스크립트의 줄입니다. 호출은 다음과 같습니다.
perl revrs-tree.pl --zerofill test.tree > test-tree.sh
# alternatively, can receive tree text from stdin:
cat test.tree | perl revrs-tree.pl --zerofill > test-tree.sh
...그리고 test-tree.sh
다음을 포함합니다.
RTD="/usr/include/boost/accumulators";
read -p "WARNING! will output in '$RTD' directory!
Press [Enter] key to start output...";
if [ ! -d "$RTD" ] ; then mkdir "$RTD" ; fi ;
TDIR="$RTD/framework";
mkdir "$TDIR"; sudo chown root:root "$TDIR"; sudo chmod 755 "$TDIR"; sudo touch -d 'Jul 16 2014 9:43:00' "$TDIR";
TDIR="$RTD/framework/accumulators";
mkdir "$TDIR"; sudo chown root:root "$TDIR"; sudo chmod 755 "$TDIR"; sudo touch -d 'Jul 16 2014 9:43:00' "$TDIR";
TFIL="$RTD/framework/accumulators/droppable_accumulator.hpp";
cat /dev/zero | head --bytes 9740 > "$TFIL";
touch -d 'Oct 21 2010 0:00:00' "$TFIL"; sudo chown root:root "$TFIL"; sudo chmod 644 "$TFIL";
...
여기서의 비결은 다음과 같습니다.
- 스크립트를 실행하기 전에 변경해야 한다는 점을 기억하세요 . 저는 한 번도 변경하지 않았으며 0 패딩으로 파일을 덮어
RTD
썼습니다 !/usr/include/boost/accumulators
(이것은sudo apt-get remove --purge libboost1.42-dev && sudo apt-get install libboost1.42-dev
나에게 필수입니다)! ! ! (이것이 스크립트가 시작 시 사용자 입력을 기다리는 이유입니다.)...로 변경했다고 가정합니다/tmp/newtarget
. tree
완전한 타임스탬프를 제공하지 않으므로 시간은 일반적으로 0으로 설정됩니다.tree
또한 uids/gids를 7자 또는 8자로 자릅니다. 따라서 이보다 긴 경우 스크립트를 확인.sh
하고 적절한 위치로 대체하십시오.
root
그런 다음 OP 예제가 소유 디렉터리 이기 때문에 .sh
스크립트가 sudo
적절한 위치에 포함되므로 슈퍼유저라고 부를 수도 있습니다.
sudo bash test-tree.sh
많은 set -x
인쇄 후에 스크립트가 완료되어야 합니다. 그런 다음 diff
- 또는를 사용하여 디렉터리/파일 트리 구조가 올바르게 재구축되었는지 확인할 수 있습니다 meld
.
meld <(tree -spugD /tmp/newtarget/) <(tree -spugD /usr/include/boost/accumulators/)
tree
이로 인해 루트 디렉터리(이 예에서는)를 제외하고 출력에 차이가 없습니다.