Pular para a iteração de loop, dependendo da resposta à seleção interna

0

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
    
por David Kennedy 25.12.2015 / 22:51

1 resposta

1

Editar: você pode tentar este:

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
    
por 25.12.2015 / 23:47

Tags