web-dev-qa-db-ja.com

mkdirを使用して多数のディレクトリを作成する

mkdirを使用して多くのディレクトリを作成したいと思います。各ディレクトリ名は、プレフィックス(文字列)とインデックス(整数)で構成されます。プレフィックスを "s"に、インデックスを1〜50の範囲にしたいとします。これは、次のタイトルのディレクトリを作成することを意味します。

s1s2、...、s49s50

mkdirを使用してこれを自動的に行う方法はありますか?御時間ありがとうございます。

15
Andrew

これは、シェルスクリプトを使用して実行できます。

純粋な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}
33
Random832
  • 1つ

    for i in {1..50}; do
      mkdir s"$i"
    done
    
  • 2つ

    mkdir s{1..50}
    

    このオプションはbashzshおよびksh9で機能します

  • mkdir $(printf "s%02i " $(seq 1 50))
    
33
Jhonathan

ここにはたくさんの複雑な答えがありますが、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
10
laebshade

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

5
cas

ちなみに、これは再帰を使用する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
4
kojiro