私たちは皆、これを使って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";
...
ここでの秘訣は次のとおりです。
- スクリプトを実行する前に変更する必要があることに注意してください。私は一度も変更せず、ゼロパディングでファイルを上書き
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
これにより、ルートディレクトリ(この例では)を除いて出力に違いはありません。