だから、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
ループは位置パラメータ配列インデックスごとに1回だけループします。ここsh
では、呼び出し時にパラメータを渡すことで設定しますset ${positionals}
。ただしprintf
、各反復の引数リストで同じ配列を受け取り、その各引数にフォーマット文字列を適用するため、不必要な再帰なしで再帰の外観を取得できます。
そして、同じ方法でパイプを介してループのdone|command
すべてfor
の出力をストリームに追加すると、すべてがdone >file
ファイルにストリームされます- for...done
構造全体に対して出力ファイルを一度だけ開いたり閉じたりします。