bashシェルのforループに2つの変数を指定するには?

bashシェルのforループに2つの変数を指定するには?

1つのフォルダに複数の画像ファイルがあり、各ファイルのフォルダを作成しました。これで、cp各フォルダに1つのファイルが必要です。

使った

for i in `seq 1 9`; do mkdir $i; done

次に、すべてのファイルをフォルダにコピーします。使ってみよう

for s in Whats* && i in `seq 1 9`;do cp $s $i;done
for s in *; do for i in `seq 1 9`;do mkdir $i;done;cp $s $i;done

これは明らかに動作しません。 (すべてのファイル名はWhatsAppで始まります)

各フォルダに一度に1つずつファイルをコピーする方法は?

答え1

./WhatsApp*整数名のディレクトリが必要で、各ファイルにパターンと一致するディレクトリがあることを想定してみましょう。

shopt -s nullglob

counter=0
for name in ./WhatsApp*; do
    counter=$(( counter + 1 ))
    mkdir "$counter" && cp "$name" "$counter"
done

これは、一致する各名前のディレクトリを作成しようとし、成功すると、ファイルをその新しいディレクトリにコピーします。mkdirディレクトリがすでに存在する場合、または現在のディレクトリに書き込みおよび実行権限がない場合、呼び出しは失敗します。

nullglob与えられたパターンと一致する名前がない場合、ループの単一の繰り返し実行を避けるために、ループの前にシェルオプションを設定しました。設定がない場合、nullglobループは一度実行され、$name設定はリテラル文字列に設定されます./WhatsApp*

関連情報