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 -nmencegah overwrite — kalau ada target file dengan nama sama, akan di-suffix-1,-2, dst.- Untuk macOS
statvs Linuxstatbeda flag — snippet ini coba dua-duanya dengan||fallback. - Kalau foto sangat banyak (10k+), pertimbangkan
find ... -print0 | xargs -0daripada 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