#!/bin/bash # Rename all image and video files in the current directory by their capture/creation date. set -euo pipefail mkdir -p 'done' # Directory to process (defaults to current directory) DIR="${1:-.}" cd "$DIR" # Supported extensions (add more if needed) shopt -s nullglob nocaseglob FILES=(*.jpg *.jpeg *.png *.mov *.mp4) # FILES=(*.jpg *.jpeg *.png) for FILE in "${FILES[@]}"; do # Skip if not a regular file [ -f "$FILE" ] || continue # Extract datetime from EXIF or file creation date as fallback DATE=$(exiftool -m -DateTimeOriginal -d "%Y-%m-%d %H-%M-%S" -s3 "$FILE" | head -n 1) # If EXIF data missing, fallback to filesystem creation/modification time if [ -z "$DATE" ]; then # The following lines need to be customized for the specific image names continue # if [[ "$FILE" == *.jpg || "$FILE" == *.jpeg || "$FILE" == *.png ]]; then # if [[ "$FILE" == IMG*WA* ]]; then # DATE=$(echo $FILE | sed 's/IMG-//' | sed 's/-WA.*//') # DATE="${DATE:0:4}-${DATE:4:2}-${DATE:6:2}" # elif [[ "$FILE" == *" "*" "* ]]; then # DATE=$(echo $FILE | awk '{print $1, $2}') # else # DATE="${FILE:0:4}-${FILE:4:2}-${FILE:6:2} ${FILE:8:2}-${FILE:10:2}-${FILE:12:2}" # fi # fi # if [[ "$FILE" == *.mov || "$FILE" == *.mp4 ]]; then # # if [[ "$FILE" == *" "*" "* ]]; then # DATE=$(echo $FILE | awk '{print $1, $2}') # DATE=$(echo "20$DATE") # elif [[ "$FILE" == VID*WA* ]]; then # DATE=$(echo $FILE | sed 's/VID-//' | sed 's/-WA.*//') # DATE="${DATE:0:4}-${DATE:4:2}-${DATE:6:2}" # elif [[ "$FILE" == VID_* ]]; then # DATE=$(echo $FILE | sed 's/VID_//' ) # DATE="${DATE:0:4}-${DATE:4:2}-${DATE:6:2} ${DATE:9:2}-${DATE:11:2}-${DATE:13:2}" # elif [[ "$FILE" =~ ^[0-9]+_[0-9]+\..*$ ]]; then # DATE="${FILE:0:4}-${FILE:4:2}-${FILE:6:2} ${FILE:9:2}-${FILE:11:2}-${FILE:13:2}" # elif [[ "$FILE" =~ ^[0-9]+\..*$ ]]; then # DATE="${FILE:0:4}-${FILE:4:2}-${FILE:6:2} ${FILE:8:2}-${FILE:10:2}-${FILE:12:2}" # else # continue # fi # fi fi # Extract extension (lowercase) EXT="${FILE##*.}" EXT_LOWER=$(echo "$EXT" | tr '[:upper:]' '[:lower:]') NEWNAME="done/${DATE}.${EXT_LOWER}" # Handle duplicates (append counter) COUNTER=1 while [ -e "$NEWNAME" ]; do NEWNAME="done/${DATE} $COUNTER.${EXT_LOWER}" ((COUNTER++)) done echo "Renaming: $FILE → $NEWNAME" mv "$FILE" "$NEWNAME" done