← Kembali

Bash Menengah Otomasi

Batch rename foto berdasarkan EXIF date

Rename ratusan foto dari smartphone (IMG_xxxx.jpg, PXL_xxxx.jpg) menjadi format konsisten 2026-05-28-103045.jpg berdasarkan metadata EXIF.

Dipublikasikan 26 Mei 2026

Setelah dump foto dari HP, biasanya namanya campur: IMG_20260528_103045.jpg dari Android, PXL_20260528_103045.jpg dari Pixel, IMG_5432.HEIC dari iPhone. Snippet ini rename semua ke format seragam YYYY-MM-DD-HHMMSS.ext berdasarkan EXIF DateTimeOriginal, dengan fallback ke modification time kalau EXIF tidak ada.

Prasyarat

Install exiftool:

# macOS
brew install exiftool

# Ubuntu/Debian
sudo apt install libimage-exiftool-perl

Kode

#!/usr/bin/env bash
# rename-foto.sh — Rename foto berdasarkan EXIF DateTimeOriginal.
# Usage: ./rename-foto.sh /path/to/foto/dir

set -euo pipefail

DIR="${1:-.}"

if [ ! -d "$DIR" ]; then
  echo "Error: directory '$DIR' tidak ada" >&2
  exit 1
fi

cd "$DIR"

# Loop semua foto
for file in *.jpg *.jpeg *.JPG *.JPEG *.HEIC *.heic *.png *.PNG; do
  # Skip kalau pattern tidak match (Bash glob behavior)
  [ -e "$file" ] || continue

  # Ambil EXIF DateTimeOriginal, fallback ke mtime
  date_str=$(exiftool -DateTimeOriginal -d "%Y-%m-%d-%H%M%S" -s -s -s "$file" 2>/dev/null)
  
  if [ -z "$date_str" ]; then
    # Fallback: modification time
    date_str=$(stat -f "%Sm" -t "%Y-%m-%d-%H%M%S" "$file" 2>/dev/null \
             || stat --format="%y" "$file" | cut -d'.' -f1 | tr ' :' '--' | cut -d'-' -f1-5)
    echo "WARN: $file — pakai mtime ($date_str)"
  fi

  # Cek duplikasi — kalau target file sudah ada, tambahkan suffix
  ext="${file##*.}"
  ext_lower=$(echo "$ext" | tr '[:upper:]' '[:lower:]')
  target="${date_str}.${ext_lower}"
  counter=1
  while [ -e "$target" ] && [ "$target" != "$file" ]; do
    target="${date_str}-${counter}.${ext_lower}"
    counter=$((counter + 1))
  done

  if [ "$target" != "$file" ]; then
    mv -n "$file" "$target"
    echo "OK: $file$target"
  fi
done

echo "Selesai."

Kapan dipakai

  • Membersihkan folder Backup HP yang sudah berbulan-bulan tidak diurus.
  • Sebelum upload ke cloud storage yang butuh nama file konsisten (Google Photos backup, Synology, NAS rumahan).
  • Saat preparing dataset untuk training ML — nama file kronologis lebih mudah di-sort.

Catatan

  • Script ini idempotent — kalau dijalankan dua kali, file yang sudah di-rename tidak akan disentuh karena cek target != file.
  • mv -n mencegah overwrite — kalau ada target file dengan nama sama, akan di-suffix -1, -2, dst.
  • Untuk macOS stat vs Linux stat beda flag — snippet ini coba dua-duanya dengan || fallback.
  • Kalau foto sangat banyak (10k+), pertimbangkan find ... -print0 | xargs -0 daripada glob — Bash glob ada limit memory di list super besar.

Backup folder dulu sebelum jalankan ini! cp -r foto/ foto-backup/. Sekali rename, susah rollback kalau scriptnya salah konfigurasi.

# tags

exiftoolfotorenamearchive

← Semua snippet Snippet Bash lain →