0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

macOSでファイルの作成日時を使って `YYMMDD_HHmmss.ext` に一括リネームするワンライナー

0
Posted at

ファイルの作成日時をもとに、以下のような形式へ一括リネームしたいことがあります。

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

同名衝突が心配な場合は、連番つき版を使うと安心です。

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?