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


13

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

s1s2、...、 s49s50

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


2
どのシェルを使用していますか?
フランチェスコターコ

@FrancescoTurcoを使用していbashます。お時間をいただきありがとうございます!
アンドリュー

3
ちなみに、私はそれを見つけるずっとより有用と同じように、固定幅のインデックスを使用します:s01s02、...、 、。s49 s50固定幅のインデックスを使用した場合、/bin/lsほとんどの場合、希望する順序が生成されます。
ロブ

回答:


31

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

純粋なsh-これはPOSIX以前のbourneシェルでも動作します:

n=1;
max=50;
while [ "$n" -le "$max" ]; do
  mkdir "s$n"
  n=`expr "$n" + 1`;
done

多数のディレクトリを作成する場合は、スクリプトを1回の呼び出しに減らしてmkdir、テストおよび算術演算にシェル組み込みコマンドを使用することにより、スクリプトを高速化できます。このような:

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}

3
+1これは素晴らしい!ただし、1つn=$(( n + 1 ))だけ注意が必要です。厳密にはPOSIXであり、サブシェルの費用はかかりません。
小次郎

@rahmu [[キーワードはPOSIXではありません。(言うまでもなく、これ[ 多くの現代のシェルに組み込まれたシェルです。)
kojiro

@kojiro:[[私のksh88(以前のbash)で動作するため、POSIXであると想定しました。POSIX仕様でそれについて言及することができなかったので、あなたは正しいと信じています。情報をありがとう!
ラーム

算術展開を使用してバージョンを追加することを考えましたが、「純粋なsh」をPOSIX以前のバージョンでも機能するものに限定したかったのです。同じ理由でseqについても言及しませんでした-seqがあれば、おそらくbashがあります。ループの例は、多数のディレクトリの引数制限をバイパスするのにも適しfor i in {range}ています。これは、高度なシェルのユーザーのための場所があることも意味します。
Random832

最後のzshヒントは驚くべきもので、時間を大幅に節約してくれました!
ジェイス

33
  • 1

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

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

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

4
なぜ2つ以上を使用するのですか?
ケビン

7
$iディレクトリを作成するだけでなく、もっと多くのことをしたいと思うかもしれませんmkdir s$i ; echo $i > s$i/$i。また、Oneはbashでforループを使用する素敵でシンプルな例です...このようなサイトでは、初心者ユーザーがそれを見て、「いいね、私はそれができるとは思わなかった」と考えることはまずありません"--->啓発。
cas

1
@rahmuこれは、Bash / Zshにある機能です(おそらくksh93も)。投票する必要はありません。
ヘルパーメソッド

3
@rahmu:ジョナサンの答えがOPのシェル(bash)の問題を解決するかどうかを考慮する必要があると思います。必ずしも他の問題ではありません。
フランチェスコターコ

4
@Kevinは50の問題ではないかもしれませんが、作成するディレクトリが500個ある場合、引数の制限について心配するかもしれません。
Random832

10

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

5

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から

奇妙なことに、配列の--formatか、-fオプションはprintf関数の浮動小数点double型ことができます(fとgのように。また、私はのための任意の使用を発見したことがないという奇妙な浮動小数点進形式)。理由はわかりません。他にもサポートされていればいいですねprintf(3)整数(d、i)、8進数(o、U)、16進数(x、X)などの数値型。

とにかく、のような0小数の精度でダブル形式%.0fまたは%02.0fこの目的のために整数に近い十分です。

$ seq --help
使用法:seq [OPTION] ... LAST
  または:seq [OPTION] ... FIRST LAST
  または:seq [OPTION] ... FIRST INCREMENT LAST
インクリメントのステップで、最初から最後まで数字を印刷します。

  -f、--format = FORMAT printfスタイルの浮動小数点FORMATを使用
  -s、-separator = STRING STRINGを使用して数字を区切ります(デフォルト:\ n)
  -w、--equal-width先行ゼロでパディングすることにより幅を均等化します
      --helpこのヘルプを表示して終了
      --versionバージョン情報を出力して終了する

FIRSTまたはINCREMENTが省略された場合、デフォルトは1です。つまり、
LASTがFIRSTより小さい場合でも、INCREMENTの省略はデフォルトで1になります。
FIRST、INCREMENT、およびLASTは、浮動小数点値として解釈されます。
FIRSTがLASTより小さい場合、INCREMENTは通常正です。
FIRSTがLASTより大きい場合、INCREMENTは通常負です。
FORMATは、タイプ 'double'の1つの引数の出力に適していなければなりません。
FIRST、INCREMENT、およびLASTがすべて固定小数点の場合、デフォルトは%.PRECfです
最大精度PRECの10進数、それ以外の場合は%g。

参照:http : //www.gnu.org/software/coreutils/manual/html_node/seq-invocation.html


{1,50}または{01,50}(ゼロパディングの場合)がはるかに簡単で理解しやすいです。
ケビン

1
true ... shではなくbashを使用している場合。だからこそ、@ Random832の答えを支持しました。それは良い答えです。seqを使用することも有用な答えです。
cas

4

異なるために、再帰を使用する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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.