「ツリー」の反対 - テキストファイルの内容からファイルとディレクトリ構造を再構成しますか?

「ツリー」の反対 - テキストファイルの内容からファイルとディレクトリ構造を再構成しますか?

私たちは皆、これを使って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";
...

ここでの秘訣は次のとおりです。

  • スクリプトを実行する前に変更する必要があることに注意してください。私は一度も変更せず、ゼロパディングでファイルを上書きRTDしました!/usr/include/boost/accumulators(これはsudo apt-get remove --purge libboost1.42-dev && sudo apt-get install libboost1.42-dev私にとって必須です)! ! ! (これがスクリプトが起動時にユーザー入力を待つ理由です。)...に変更したとします/tmp/newtarget
  • tree完全なタイムスタンプを提供しないため、時間は通常ゼロに設定されます。
  • 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これにより、ルートディレクトリ(この例では)を除いて出力に違いはありません。

関連情報