ファイルの作成日時をもとに、以下のような形式へ一括リネームしたいことがあります。
IMG_1234.png
↓
260616_132455.png
この記事では、macOS のターミナルで使えるワンライナーをまとめます。
やりたいこと
- ファイルの作成日時を使う
- ファイル名を
YYMMDD_HHmmss形式にする - 拡張子は元ファイルのものをそのまま使う
- 例:
260616_132455.png
全ファイルを一括リネームする
カレントディレクトリ内のファイルを、作成日時ベースでリネームします。
for f in *.*; do [ -f "$f" ] || continue; ext="${f##*.}"; ts=$(date -r "$(stat -f %B "$f")" "+%y%m%d_%H%M%S"); mv -n "$f" "${ts}.${ext}"; done
解説
拡張子を取得する
ext="${f##*.}"
ファイル名の最後の . 以降を拡張子として取得しています。
たとえば、
photo.png
であれば、
png
になります。
ファイルの作成日時を取得する
stat -f %B "$f"
macOS の stat コマンドで、ファイルの作成日時を Unix time として取得しています。
日付フォーマットを整える
date -r "$(stat -f %B "$f")" "+%y%m%d_%H%M%S"
取得した作成日時を、以下のような形式に変換しています。
YYMMDD_HHmmss
たとえば、2026年6月16日 13時24分55秒なら、
260616_132455
になります。
上書きを防ぐ
mv -n "$f" "${ts}.${ext}"
mv -n を使うことで、同名ファイルがすでに存在する場合に上書きしないようにしています。
同じ秒に作成されたファイルがある場合
同じ秒に作成された同じ拡張子のファイルがあると、ファイル名が衝突する可能性があります。
その場合は、末尾に連番をつける版が便利です。
for f in *.*; do [ -f "$f" ] || continue; ext="${f##*.}"; base=$(date -r "$(stat -f %B "$f")" "+%y%m%d_%H%M%S"); new="${base}.${ext}"; i=1; while [ -e "$new" ] && [ "$new" != "$f" ]; do new="${base}_${i}.${ext}"; i=$((i+1)); done; [ "$f" = "$new" ] || mv "$f" "$new"; done
たとえば、同じタイムスタンプのファイルが複数ある場合は、
260616_132455.png
260616_132455_1.png
260616_132455_2.png
のようになります。
PNGだけを対象にする場合
PNGファイルだけを対象にしたい場合はこちらです。
for f in *.png; do [ -f "$f" ] || continue; ts=$(date -r "$(stat -f %B "$f")" "+%y%m%d_%H%M%S"); mv -n "$f" "${ts}.png"; done
実行前に確認したい場合
いきなりリネームするのが不安な場合は、まず mv の代わりに echo を使って確認できます。
for f in *.*; do [ -f "$f" ] || continue; ext="${f##*.}"; ts=$(date -r "$(stat -f %B "$f")" "+%y%m%d_%H%M%S"); echo mv -n "$f" "${ts}.${ext}"; done
問題なさそうであれば、echo を外して実行します。
注意点
このワンライナーは macOS 向けです。
Linux では stat コマンドのオプションが異なるため、そのままでは動かない場合があります。
また、ファイルシステムやコピー方法によっては、作成日時が意図した日時になっていないことがあります。実行前に、対象ファイルの作成日時を確認しておくと安心です。
まとめ
macOS でファイルの作成日時をもとに一括リネームしたい場合は、以下でできます。
for f in *.*; do [ -f "$f" ] || continue; ext="${f##*.}"; ts=$(date -r "$(stat -f %B "$f")" "+%y%m%d_%H%M%S"); mv -n "$f" "${ts}.${ext}"; done
同名衝突が心配な場合は、連番つき版を使うと安心です。