web-dev-qa-db-ja.com

linux-Shell:ファイル名を作成時間に変更

みなさんおはようございます、

フォルダー内のファイル(写真)の名前を「1.jpg、2.jpg、3.jpg ...」から「yyyymmdd_hhmmss.jpg」に変更したいので、作成を読みたいこれは、写真の名前として設定されます。たとえば、linux-Shellやimagemagickでそれを行う方法を誰かが知っていますか?

ありがとうございました!

20
Andre

ファイルシステムの日付に基づく命名

Linuxシェル:

_for f in *.jpg
do
    mv -n "$f" "$(date -r "$f" +"%Y%m%d_%H%M%S").jpg"
done
_

説明

  • _for f in *.jpg do_

    これにより、すべてのjpegファイルのループが開始されます。この機能は、スペース、タブ、その他の難しい文字が名前に含まれているファイルも含め、すべてのファイル名で機能することです。

  • mv -n "$f" "$(date -r "$f" +"%Y%m%d_%H%M%S").jpg"

    これにより、ファイルの名前が変更されます。現在の日付ではなくファイルの日付を表示するようにdateに指示する_-r_オプションを使用します。仕様_+"%Y%m%d_%H%M%S"_は、指定したとおりにフォーマットするようにdateに指示します。

    ファイル名_$f_は、使用される場合は常に二重引用符で囲みます。これにより、奇妙なファイル名がエラーを引き起こさないことが保証されます。

    mvの_-n_オプションは、既存のファイルを上書きしないようにmoveに指示します。

  • done

    これでループは完了です。

対話的に使用する場合は、コマンドをすべて1行で記述することをお勧めします。その場合は、以下を使用します。

_for f in *.jpg; do mv -n "$f" "$(date -r "$f" +"%Y%m%d_%H%M%S").jpg"; done
_

EXIF作成日に基づく命名

EXIFの作成日(ファイルシステムの日付ではなく)に基づいてファイルに名前を付けるには、exiftoolまたは同等のものが必要です。

_for f in *.jpg
do
    mv -n "$f" "$(exiftool -d "%Y%m%d_%H%M%S" -CreateDate "$f" | awk '{print $4".jpg"}')"
done
_

説明

上記はファイル日付のコマンドに非常に似ていますが、EXIFイメージ作成日付を抽出するためにexiftoolおよびawkを使用しています。

  • exiftoolコマンドは、次のような形式で日付を提供します。

    _$ exiftool -d "%Y%m%d_%H%M%S"  -CreateDate sample.jpg
    Create Date                     : 20121027_181338
    _

    必要な実際の日付は、出力の4番目のフィールドです。

  • 必要なフィールドを抽出できるように、exiftool出力をawkに渡します。

    _awk '{print $4".jpg"}'
    _

    これにより、日付フィールドが選択され、_.jpg_拡張子も追加されます。

36
John1024

これを試して

for file in `ls -1 *.jpg`; do name=`stat -c %y $file | awk -F"." '{ print $1 }' | sed -e "s/\-//g" -e "s/\://g" -e "s/[ ]/_/g"`.jpg; mv $file $name; done

もっと簡単な方法があるかもしれませんが。

1
Ashish Gaur