シェルスクリプトで2つの反復可能なオブジェクトのセットを繰り返すには?

シェルスクリプトで2つの反復可能なオブジェクトのセットを繰り返すには?

通常、特定のタスク用のシェルスクリプトを作成するときに、次のファイルのリストを作成します。

#/bin/sh
read -d '' imagefiles <<EOF

./01/IMG0000.jpg
./01/IMG0001.jpg
./01/IMG0002.jpg
./01/IMG0003.jpg
./01/IMG0004.jpg
./01/IMG0005.jpg
./01/IMG0006.jpg
./01/IMG0007.jpg
(a whole bunch of files down to ./10/IMG0102.jpg)

EOF

for i in $imagefiles
  for j in range(len(commands))
do

mv $i ./$j.jpg

  done
done

この場合、出力を繰り返すことができるようにしたいのですが、Gillesが提案したように、seqこの部分をPythonで書いてください(例えば、各コマンドがj回実行されて約100,000回実行されることを知っています)。以前は736個のファイルを順番に名前を変更しましたが、今では名前を変更するファイルが1000個を超えています。これを行うより良い方法があると確信していますが(躊躇しないでください)、コマンドリストと他の繰り返し可能な項目を繰り返す方法を知ることもできます。

ベストアンサー1

いいですね。 2つの反復可能項目を圧縮しようとしています。つまり、追加のカウンタを使用して複数の文字列を繰り返すループが必要です。カウンターを実装するのはとても簡単です。

n=0
for x in $commands; do
  mv -- "$x" "$n.jpg"
  n=$(($n+1))
done

これは、繰り返したい要素にスペース(またはワイルドカード)が含まれていない場合にのみ機能します。項目が改行で区切られている場合は、ワイルドカードをオフにして改行に分割します。

n=0
IFS='
'; set -f
for x in $commands; do
  mv -- "$x" "$n.jpg"
  n=$(($n+1))
done
set +f; unset IFS

データを一度だけ繰り返す必要がある場合は、ループを実行してくださいread(参照:while IFS= read代わりに、なぜそれほど頻繁に使用されますかIFS=; while read..詳細な説明は)

n=0
while IFS= read -r x; do
  mv -- "$x" "$n.jpg"
  n=$(($n+1))
done <<EOF
EOF

配列(bash、ksh、またはzsh)を持つシェルを使用している場合は、配列に要素を保存します。 zshでsetopt ksh_arrays0から始まる番号付き配列要素を実行するか、1から始まる配列要素番号付けを開始するようにコードを調整します。

commands=(
    ./01/IMG0000.jpg
)
n=0
while [[ $n -lt ${#commands} ]]; do
  mv -- "${commands[$n]}" "$n.jpg"
done

おすすめ記事