Eu tenho o seguinte script bash, que percorre todas as imagens em um diretório e tenta determinar a data e a hora em que foi criado usando exif. Se a informação exif não estiver disponível, ele pergunta ao usuário se deve usar a data da última modificação da imagem. Se o usuário recusar, a imagem deve ser ignorada:
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
O problema é que, mesmo que o usuário recuse que a última linha ainda seja alcançada (por exemplo, "Renomeando $ file ..." é impresso para stdout). Eu acho que isso é porque o break
impede que o continue
seja atingido. Eu tentei inverter essas duas instruções, mas isso resulta em um loop infinito:
No)
echo "Info: $file skipped - not using last modified date"
continue
break
;;
Espero que esteja claro o que estou tentando fazer.
EDITAR
Encontrei algo que funciona, mas deixe-me saber se existe uma maneira melhor:
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