ディレクトリ内のすべてのイメージを繰り返し、EXIFを使用して作成された日時を確認するための次のbashスクリプトがあります。 EXIF情報が利用できない場合は、画像の最後の変更日を使用する必要があるかどうかをユーザーに尋ねます。ユーザーが拒否した場合は、イメージをスキップする必要があります。
for file in *.jpg; do
if datetime="$(exif --debug --machine-readable --tag=DateTimeOriginal "$file" 2>&1)"; then
datetime="${datetime##*$'\n'}"
else
datetime="$(stat --format=%y "$file")"
datetime="${datetime%\.*}"
echo "Warning: $file does not contain tag DateTimeOriginal"
echo "Last modified date is $datetime - use it instead?"
select yn in "Yes" "No"; do
case "$yn" in
Yes)
echo "Info: using last modified date for $file"
break
;;
No)
echo "Info: $file skipped - not using last modified date"
break
continue
;;
esac
done
fi
echo "Renaming $file..."
done
問題は、ユーザーがそれを拒否してもまだ最後の行に達することです(つまり、「Rename $ file ...」が標準出力に印刷されます)。私の考えでは、到着がブロックされたbreak
ためだと思いますcontinue
。これら2つのステートメントを反転してみましたが、これにより無限ループが発生しました。
No)
echo "Info: $file skipped - not using last modified date"
continue
break
;;
私がしたいことが何であるかを明確にしてください。
編集する
うまくいくのを見つけましたが、より良い方法があれば教えてください。
for file in *.jpg; do
answer=
if datetime="$(exif --debug --machine-readable --tag=DateTimeOriginal "$file" 2>&1)"; then
datetime="${datetime##*$'\n'}"
else
datetime="$(stat --format=%y "$file")"
datetime="${datetime%\.*}"
echo "Warning: $file does not contain tag DateTimeOriginal"
echo "Last modified date is $datetime - use it instead?"
option1="Use last modified date"
option2="Skip file"
select answer in "$option1" "$option2"; do
case "$answer" in
"$option1"|"$option2")
break
;;
esac
done
if [ "$answer" = "$option2" ]; then
echo "Info: $file skipped - not using last modified date"
continue
fi
fi
echo "Renaming $file..."
done
ベストアンサー1
編集する: 次のことを試すことができます。
for file in *.jpg; do
if datetime="$(exif --debug --machine-readable --tag=DateTimeOriginal "$file" 2>&1)"; then
datetime="${datetime##*$'\n'}"
else
datetime="$(stat --format=%y "$file")"
datetime="${datetime%\.*}"
echo "Warning: $file does not contain tag DateTimeOriginal"
echo "Last modified date is $datetime - use it instead?"
select yn in "Yes" "No"; do
case "$yn" in
Yes)
echo "Info: using last modified date for $file"
break
;;
No)
echo "Info: $file skipped - not using last modified date"
break && continue
;;
esac
done
fi
echo "Renaming $file..."
done