diff --git a/photos-metadata.sh b/photos-metadata.sh index 4917ba1..0dd60a1 100755 --- a/photos-metadata.sh +++ b/photos-metadata.sh @@ -4,13 +4,14 @@ # Directory to start the search base_dir=~/Pictures/Photos/Camera log_file="metadata_changes.log" +temp_file="metadata_changes_temp.log" # Function to extract date and time from filename extract_datetime_from_filename() { filename=$(basename "$1") datetime="" - # Patterns to match filenames with date and time + # Patterns to match filenames with date and time if [[ "$filename" =~ ([0-9]{4})-([0-9]{2})-([0-9]{2})_([0-9]{2})_([0-9]{2})_([0-9]{2}) ]]; then datetime="${BASH_REMATCH[1]}:${BASH_REMATCH[2]}:${BASH_REMATCH[3]} ${BASH_REMATCH[4]}:${BASH_REMATCH[5]}:${BASH_REMATCH[6]}" elif [[ "$filename" =~ ([0-9]{4})([0-9]{2})([0-9]{2})_([0-9]{2})([0-9]{2})([0-9]{2}) ]]; then @@ -21,12 +22,14 @@ extract_datetime_from_filename() { datetime="${BASH_REMATCH[1]:0:4}:${BASH_REMATCH[1]:4:2}:${BASH_REMATCH[1]:6:2} ${BASH_REMATCH[2]:0:2}:${BASH_REMATCH[2]:2:2}:${BASH_REMATCH[2]:4:2}" elif [[ "$filename" =~ ([0-9]{8}) ]]; then datetime="${BASH_REMATCH[1]:0:4}:${BASH_REMATCH[1]:4:2}:${BASH_REMATCH[1]:6:2} 00:00:00" + elif [[ "$filename" =~ ([0-9]{4})-([0-9]{2})-([0-9]{2})\ ([0-9]{2})_([0-9]{2})_([0-9]{2}) ]]; then + datetime="${BASH_REMATCH[1]}:${BASH_REMATCH[2]}:${BASH_REMATCH[3]} ${BASH_REMATCH[4]}:${BASH_REMATCH[5]}:${BASH_REMATCH[6]}" elif [[ "$filename" =~ ([0-9]{4})-([0-9]{2})-([0-9]{2}) ]]; then datetime="${BASH_REMATCH[1]}:${BASH_REMATCH[2]}:${BASH_REMATCH[3]} 00:00:00" fi # Validate extracted date -if echo "$datetime" | grep -qE '^([0-9]{4}):([0-9]{2}):([0-9]{2}) ([0-9]{2}):([0-9]{2}):([0-9]{2})$'; then + if echo "$datetime" | grep -qE '^([0-9]{4}):([0-9]{2}):([0-9]{2}) ([0-9]{2}):([0-9]{2}):([0-9]{2})$'; then year=$(echo "$datetime" | cut -d':' -f1) month=$(echo "$datetime" | cut -d':' -f2) day=$(echo "$datetime" | cut -d':' -f3 | cut -d' ' -f1) @@ -57,10 +60,10 @@ log_change() { photo="$1" old_date="$2" new_date="$3" - echo "File: $photo" >> "$log_file" - echo " Old Date: $old_date" >> "$log_file" - echo " New Date: $new_date" >> "$log_file" - echo "" >> "$log_file" + echo "File: $photo" >> "$temp_file" + echo " Old Date: $old_date" >> "$temp_file" + echo " New Date: $new_date" >> "$temp_file" + echo "" >> "$temp_file" } # Loop through each year directory @@ -89,15 +92,13 @@ for year_dir in "$base_dir"/*/; do if [ -n "$filename_datetime" ]; then new_date="$filename_datetime" log_change "$photo" "No date metadata" "$new_date" - echo "Updating date for: $photo" + echo "Found: $photo" echo " Extracted date from filename: $new_date" - # exiftool -overwrite_original -DateTimeOriginal="$new_date" "$photo" else new_date="$year:$month:01 00:00:00" log_change "$photo" "No date metadata" "$new_date" - echo "Updating date for: $photo" + echo "Found: $photo" echo " Defaulting to directory date: $new_date" - # exiftool -overwrite_original -DateTimeOriginal="$new_date" "$photo" fi else photo_year=$(echo "$photo_date" | cut -d':' -f1) @@ -126,8 +127,7 @@ for year_dir in "$base_dir"/*/; do echo " Directory date: $year/$month" echo " Photo date: $photo_date" echo " Filename date: $filename_datetime" - echo " Updating photo metadata to match filename date." - # exiftool -overwrite_original -DateTimeOriginal="$new_date" "$photo" + echo " Suggested action: Update photo metadata to match filename date." fi else echo "Mismatch found: $photo" @@ -142,9 +142,23 @@ for year_dir in "$base_dir"/*/; do done # Ask for confirmation before proceeding to the next year - read -p "Finished processing year $year. Do you want to continue to the next year? (y/n): " response + read -p "Finished processing year $year. Do you want to save the changes and continue to the next year? (y/n): " response if [[ "$response" != "y" ]]; then echo "Stopping script." + rm -f "$temp_file" exit 0 + else + # Apply changes and save log + while IFS= read -r line; do + if [[ "$line" == File:* ]]; then + photo=$(echo "$line" | cut -d' ' -f2-) + elif [[ "$line" == " New Date:"* ]]; then + new_date=$(echo "$line" | cut -d' ' -f3-) + echo exiftool -overwrite_original -DateTimeOriginal="$new_date" "$photo" + fi + done < "$temp_file" + + cat "$temp_file" >> "$log_file" + rm -f "$temp_file" fi done