2016-03-31 19 views
6

mkdir -pというかなり冗長な一連のネストされたディレクトリを作成し、-pフラグを適用してディレクトリが既に存在するという警告を抑制できることはわかっています。コンパクトな文字列表現から階層的なディレクトリツリーを作成する

mkdir -p hello 
mkdir -p hello/i_am_a 
mkdir -p hello/i_am_a/boy 
mkdir -p hello/i_am_a/girl 
mkdir -p hello/i_am_a/alien 
mkdir -p hello/i_am_a/dog 
mkdir -p hello/my_name_is 
mkdir -p hello/my_name_is/jim 
mkdir -p hello/my_name_is/bob 
mkdir -p hello/my_name_is/secret 

私が代わりにリスト開放文字(すなわち{)からなる、ネストされたパターンを持つ単一の呼び出しでツリーまたはそれの少なくとも一部を構築したいと思います:これは、個々のコール、すなわちで非常に冗長取得します、リスト区切り文字(すなわち、,)、およびリストを閉じる文字(すなわち、})。

トップから始まる各レベルについて、その名前のディレクトリがまだ存在しない場合は作成されます。

は、私は入力文字列を使用することになり、本当の言葉で、上記の私の愚かな例を続行するには:

「ハロー{i_am_a {男の子、女の子、外国人、犬}、my_name_is {ジム、ボブ、秘密}} 'は、以下を作成する必要があり

を... ...便宜上

hello 
hello/i_am_a 
hello/i_am_a/boy 
hello/i_am_a/girl 
hello/i_am_a/alien 
hello/i_am_a/dog 
hello/my_name_is 
hello/my_name_is/jim 
hello/my_name_is/bob 
hello/my_name_is/secret 

、のは、それに影響ソリューションの長さがあれば、我々はよりも多くはありませんと仮定できるとしましょうの結果のツリー内のネスティングのレイヤー(例:例えば上記の例ではn=3)。

彼らは結果のファイルパスに表示されることはありませんつまり、ネストされた文字列で発生することはありません私たちは、さらに利便性のために想定する3つの特殊な構造の文字こと(例えば{ため、上記の例では、,、および})してみましょう。

PerlまたはPython埋め込みスクリプトはこのトリックを行う可能性がありますが、組み込みのBASH機能を使用すると簡単な解決策があると思われますか?

私の目標は、データの後処理スクリプトの冗長さを削減する簡潔なソリューションです。階層型のディレクトリツリーの作成には、再利用のために保存した中間層とツリーの上部に向かってディレクトリを作成します。

+9

このタイプの「自分のコードを書いてください」というリクエストは、StackOverflowにとって完全にオフトピックです。 [ask]を確認し、[help]にアクセスしてください。 –

+0

非常に具体的な1ライナーを求める多くの高評価の質問があります。 このケースでは、メソッドがあいまいである小さな非常に具体的なアクションを実装する方法を単に質問しています。これは、「この正規表現をどのように動作させるか」という質問とはまったく変わりません。 私は簡潔に/うまく作られたone-linersを勧誘することは、控えめにしたら "自分のコードを書いてください"と考えています。 –

+1

F. Hauriの解決策を見てください!すべてのあなたの好意のために、これを達成するための簡単な答えがありました!ところで、これは類似しているがやや異なる質問だったし、コミュニティはそれが受け入れられることを明らかに認めた:http://stackoverflow.com/questions/2445213/building-a-directory-tree-from-a-list-of-file-pathsあなたが特定の質問に対して特定の解決策を持っていないからといって、目的が限定され明確に定義されていれば、投稿した人を攻撃すべきではありません。もう一度、あなたの標準を適用する場合、おそらく2以上のスクリプト関連の質問の50%が消えてしまうでしょう。 –

答えて

19

これを試してみてください:さらに...

find * 
hello 
hello/i_am_a 
hello/i_am_a/dog 
hello/i_am_a/alien 
hello/i_am_a/boy 
hello/i_am_a/girl 
hello/my_name_is 
hello/my_name_is/bob 
hello/my_name_is/secret 
hello/my_name_is/jim 

mkdir -p hello/{i_am_a/{boy,girl,alien,dog},my_name_is/{jim,bob,secret}} 

は、仕事をするように見えますか?

これは、このディレクトリのそれぞれに(file_2jfile_0aという名前の)30個のファイルを作成します。

touch hello/{i_am_a/{boy,girl,alien,dog},my_name_is/{jim,bob,secret}}/file_{0..2}{a..j} 

(。この210個のファイルを取り込むために、あなたはサンプルのため、date | teeによってtouchを置き換えることができます)

find * -ls | sed -ne '1,7{p;d};:;N;$!b;${s/^.*\(\(\n[^\n]*\)\{5\}\)\n*$/...\1/p;}' 
1703938 4 drwxr-xr-x 4 user user 4096 avr 3 22:23 hello 
1703939 4 drwxr-xr-x 6 user user 4096 avr 3 22:23 hello/i_am_a 
1703943 4 drwxr-xr-x 2 user user 4096 avr 3 22:23 hello/i_am_a/dog 
1704066 0 -rw-r--r-- 1 user user  0 avr 3 22:23 hello/i_am_a/dog/file_2i 
1704057 0 -rw-r--r-- 1 user user  0 avr 3 22:23 hello/i_am_a/dog/file_1j 
1704061 0 -rw-r--r-- 1 user user  0 avr 3 22:23 hello/i_am_a/dog/file_2d 
1704052 0 -rw-r--r-- 1 user user  0 avr 3 22:23 hello/i_am_a/dog/file_1e 
... 
1704076 0 -rw-r--r-- 1 user user  0 avr 3 22:23 hello/my_name_is/jim/file_0i 
1704097 0 -rw-r--r-- 1 user user  0 avr 3 22:23 hello/my_name_is/jim/file_2j 
1704074 0 -rw-r--r-- 1 user user  0 avr 3 22:23 hello/my_name_is/jim/file_0g 
1704073 0 -rw-r--r-- 1 user user  0 avr 3 22:23 hello/my_name_is/jim/file_0f 
1704081 0 -rw-r--r-- 1 user user  0 avr 3 22:23 hello/my_name_is/jim/file_1d 

...Jonathan Lefflerとしてお勧めします。man -Pless\ +/Brace.Expansion bash

+0

ああ、それは驚くほど簡単です。 :)ありがとう! –

+3

@ JasonR.Mick:Bashマニュアルの[Brace Expansion](https://www.gnu.org/software/bash/manual/bash.html#Brace-Expansion)も参照してください。これには、これに似た例が含まれています。 –

+1

ありがとう@JonathanLeffler、私は私の* RT​​FM *推奨がありません: 'man -Pless \ +/Brace.Expansion bash' –

関連する問題