"트리"의 반대 - 텍스트 파일 내용에서 파일 및 디렉터리 구조를 재구성합니까?

"트리"의 반대 - 텍스트 파일 내용에서 파일 및 디렉터리 구조를 재구성합니까?

우리 모두는 이것을 사용하여 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 스크립트를 작성했습니다. 결과가 약간 복잡해서 여기에 게시합니다.

그것이 하는 일은 - 의 출력을 구문 분석하는 것이지만 treeOP 예제와는 달리 옵션도 필요합니다 --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이로 인해 루트 디렉터리(이 예에서는)를 제외하고 출력에 차이가 없습니다.

관련 정보