@John1024 に感謝!
最終更新日に従って、異なる拡張子を持つファイルの名前を同時に変更する必要がありました :
for f in *; do
fn=$(basename "$f")
mv "$fn" "$(date -r "$f" +"%Y-%m-%d_%H-%M-%S")_$fn"
done
「DSC_0189.JPG」➜「2016-02-21_18-22-15_DSC_0189.JPG」
「MOV_0131.avi」➜「2016-01-01_20-30-31_MOV_0131.avi」
元のファイル名を保持したくない場合:
mv "$fn" "$(date -r "$pathAndFileName" +"%Y-%m-%d_%H-%M-%S")"
私のような初心者に役立つことを願っています!
ファイル システムの日付に基づく命名
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"
これにより、ファイルの名前が変更されます。
-r
を使用しますdate
を伝えるオプション 現在の日付ではなく、ファイルの日付を表示します。仕様+"%Y%m%d_%H%M%S"
date
に伝えます 指定したとおりにフォーマットします。ファイル名、
$f
、使用される場所はどこでも二重引用符で囲みます。これにより、奇数のファイル名がエラーを引き起こさないことが保証されます。-n
mv
へのオプション 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
説明 :
上記はファイル日付のコマンドと非常に似ていますが、 exiftool
を使用しています と awk
EXIF画像の作成日を抽出します。
-
exiftool
コマンドは次のような形式で日付を提供します:$ exiftool -d "%Y%m%d_%H%M%S" -CreateDate sample.jpg Create Date : 20121027_181338
必要な実際の日付は、出力の 4 番目のフィールドです。
-
exiftool
を渡しますawk
に出力 必要なフィールドを抽出できるように:awk '{print $4".jpg"}'
これにより、日付フィールドが選択され、さらに
.jpg
が追加されます
これを試してください
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
もっと簡単な方法があるかもしれませんが。