편집하다

편집하다

디렉토리의 모든 이미지를 반복하고 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. 이 두 명령문을 뒤집어 보았지만 이로 인해 무한 루프가 발생했습니다.

                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

관련 정보