mkdir
を使用して多くのディレクトリを作成したいと思います。各ディレクトリ名は、プレフィックス(文字列)とインデックス(整数)で構成されます。プレフィックスを "s"に、インデックスを1〜50の範囲にしたいとします。これは、次のタイトルのディレクトリを作成することを意味します。
s1
、s2
、...、s49
、s50
mkdir
を使用してこれを自動的に行う方法はありますか?御時間ありがとうございます。
これは、シェルスクリプトを使用して実行できます。
純粋なsh-これは、POSIX以前のbourneシェルでも機能します。
n=1;
max=50;
while [ "$n" -le "$max" ]; do
mkdir "s$n"
n=`expr "$n" + 1`;
done
多数のディレクトリを作成したい場合は、スクリプトをmkdir
の1回の呼び出しに減らし、テストと計算にシェル組み込みを使用することで、スクリプトを高速化できます。このような:
n=1
max=50
set -- # this sets $@ [the argv array] to an empty list.
while [ "$n" -le "$max" ]; do
set -- "$@" "s$n" # this adds s$n to the end of $@
n=$(( $n + 1 ));
done
mkdir "$@"
Zsh、ksh93、またはbashはこれをはるかに簡単にしますが、これはmkdir
に組み込まれておらず、他のシェルでは機能しない可能性があることを指摘しておきます。大きなケースでは、コマンドに渡される引数の数または合計サイズの制限によっても影響を受ける場合があります。
mkdir s{1..50}
1つ
for i in {1..50}; do
mkdir s"$i"
done
2つ
mkdir s{1..50}
このオプションはbash、zshおよびksh9で機能します
三
mkdir $(printf "s%02i " $(seq 1 50))
ここにはたくさんの複雑な答えがありますが、bashを使うと本当に簡単です。確かに、純粋なPOSIXソリューションは機能しますが、とにかく、使用しているbash
シェルを利用してみませんか? ブレース展開 でこれを簡単に行うことができます:
% mkdir -v s{1..10} && ls -1d s{1..10} (09-24 17:37)
mkdir: created directory `s1'
mkdir: created directory `s2'
mkdir: created directory `s3'
mkdir: created directory `s4'
mkdir: created directory `s5'
mkdir: created directory `s6'
mkdir: created directory `s7'
mkdir: created directory `s8'
mkdir: created directory `s9'
mkdir: created directory `s10'
s1
s10
s2
s3
s4
s5
s6
s7
s8
s9
mkdir $(seq --format 's%.0f' 1 50)
または、ゼロ詰めの数値が必要な場合(ソートに適しています):
mkdir $(seq --format 's%02.0f' 1 50)
または:
mkdir s$(seq -s ' s' -w 1 50)
-$()
の直前の文字列「s」に注意してください。これがないと、最初に作成されるディレクトリは「s01」ではなく「01」になります。
そして、最後に:mkdir $(printf "s%02i " $(seq 1 50))
seq
はGNU Coreutilsからのものです
奇妙なことに、seqの_--format
_または_-f
_オプションでは、printfの浮動小数点double型(fやgなど)しか許可されていません。なぜか分かりません。それが整数(d、i)、8進数(o、U)または16進数(x、X)のような他のprintf(3)
数値型もサポートしているなら、それは素晴らしいでしょう。
とにかく、_%.0f
_や_%02.0f
_のように、小数点以下の桁数が0のdouble形式は、この目的のためには整数に十分近いです。
$ seq --help 使用方法:seq [OPTION] ... LAST または:seq [OPTION] ... FIRST LAST または:seq [オプション] ... FIRST INCREMENT LAST 最初から最後までの数値をINCREMENTのステップで出力します。 -f、--format = FORMAT printfスタイルの浮動小数点FORMATを使用します -s、--separator = STRING STRINGを使用して数値を区切ります(デフォルト:\ n) -w、--equal-width先行ゼロでパディングして幅を均等化します - -helpこのヘルプを表示して終了します --versionバージョン情報を出力して終了します FIRSTまたはINCREMENTを省略した場合、デフォルトで1になります。つまり、 省略されたINCREMENTは、LASTがFIRSTより小さい場合でもデフォルトで1になります。 FIRST、INCREMENT、LASTは浮動小数点値として解釈されます。 .____。]通常、FIRSTがLASTより大きい場合、INCREMENTは負になります。 FORMATは、タイプの1つの引数を出力するのに適している必要があります。 `double '; FIRST、INCREMENT、LASTがすべて固定小数点の場合はデフォルトで%.PRECfになり、 最大精度PRECの10進数になり、それ以外の場合は%gになります。
参照: http://www.gnu.org/software/coreutils/manual/html_node/seq-invocation.html
ちなみに、これは再帰を使用するPOSIX shソリューションです。
makedirs() {
[ "$1" -gt 0 ] || return
mkdir "s$1"
makedirs $(( $1 - 1 ))
}
$ makedirs 9
$ ls
s1 s2 s3 s4 s5 s6 s7 s8 s9