a
からのディレクトリを表示する必要がある方法でディレクトリを作成したいと思いますz
。各ディレクトリ内にサブディレクトリを作成し、等としてaa
表示できるようにする必要があります。ab
たとえば、ディレクトリの場合、私のサブディレクトリには最大までラベルがm
付けられています。ma
mb
mz
答え1
努力する:
for x in {a..z} ; do mkdir -p $x/${x}{a..z} ; done
Bashは、等XXX{a..z}
に拡張されます。持っている内部ループは必要ありません。XXXa
XXXb
以来:
$ ls
a b c d e f g h i j k l m n o p q r s t u v w x y z
$ ls m
ma mc me mg mi mk mm mo mq ms mu mw my
mb md mf mh mj ml mn mp mr mt mv mx mz
答え2
したがって、bash
文字を拡張すると、次のように動作します。
set {a..z}
for a do printf "./$a/$a%s\n" "$@"
done | xargs mkdir -p
最初の行にアルファベットを1回だけ入力すると、同じ概念がどのシェルにも移植可能でなければなりません。入力したくない場合は、セット行に移動する別の方法があります。たとえば、次のようになります。
seq -sP32P 97 123|dc
a b c d e f g h i j k l m n o p q r s t u v w x y z
...たとえば、ASCIIロケールで作業します。したがって、必要なパラメータの別々のリストset $(seq -sP32P 97 123|dc)
を取得するために、または他のコマンドを使用することができますが、単にそのコマンドを使用または入力する方が$IFS
良いことを意味します。bash
とにかく必要なときにだけ呼び出されるので、これを行うことができますmkdir
。
ただ証明するためにどのように動作します。より小さなコレクションのデバッグ出力は次のとおりです。
sh -cx 'for n do printf "./$n/$n%s\n" "$@"; done|cat' -- arg1 arg2 arg3
+ for n in '"$@"'
+ printf './arg1/arg1%s\n' arg1 arg2 arg3
+ cat
+ for n in '"$@"'
+ printf './arg2/arg2%s\n' arg1 arg2 arg3
+ for n in '"$@"'
+ printf './arg3/arg3%s\n' arg1 arg2 arg3
./arg1/arg1arg1
./arg1/arg1arg2
./arg1/arg1arg3
./arg2/arg2arg1
./arg2/arg2arg2
./arg2/arg2arg3
./arg3/arg3arg1
./arg3/arg3arg2
./arg3/arg3arg3
ご覧のとおり、各位置パラメータ配列インデックスは一度だけ繰り返されます。上記では、呼び出し時にパラメータを渡してfor
ここで設定しました。ただし、各反復はパラメータリストから同じ配列を受け取り、対応する書式文字列を適用します。各引数に追加するので、不要な再帰なしで再帰的な外観を得ることができます。sh
set ${positionals}
printf
そして、同じようにループのdone|command
すべての出力をパイプにストリーミングすると、すべてファイルにストリーミングされます。完全な構成は、出力ファイルを一度だけ開閉します。for
done >file
for...done
答え3
~からここ、結局こんなスクリプトを作ることになりました。しかし、エレガントな解決策を得ると、それは答えとして受け入れられます。
for x in {a..z}
do
mkdir -p /home/ramesh/$x
cd /home/ramesh/$x
for y in {a..z}
do
mkdir -p /home/ramesh/$x/$x$y
done
done
答え4
存在するPerl
:
perl -MFile::Path=make_path -e '
make_path(map { $l=$_; map { "$l/$l$_" } a..z } a..z)
'
File::Path
はコアモジュールなのでPerl 5.001
。