編集する

編集する

ディレクトリ内のすべてのイメージを繰り返し、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

おすすめ記事