ask before writing changes

This commit is contained in:
Danilo Reyes 2024-07-16 13:02:18 -06:00
parent d0af37ab9c
commit 2940ebb16d

View File

@ -4,13 +4,14 @@
# Directory to start the search # Directory to start the search
base_dir=~/Pictures/Photos/Camera base_dir=~/Pictures/Photos/Camera
log_file="metadata_changes.log" log_file="metadata_changes.log"
temp_file="metadata_changes_temp.log"
# Function to extract date and time from filename # Function to extract date and time from filename
extract_datetime_from_filename() { extract_datetime_from_filename() {
filename=$(basename "$1") filename=$(basename "$1")
datetime="" 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 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]}" 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 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}" 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 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" 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 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" datetime="${BASH_REMATCH[1]}:${BASH_REMATCH[2]}:${BASH_REMATCH[3]} 00:00:00"
fi fi
# Validate extracted date # 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) year=$(echo "$datetime" | cut -d':' -f1)
month=$(echo "$datetime" | cut -d':' -f2) month=$(echo "$datetime" | cut -d':' -f2)
day=$(echo "$datetime" | cut -d':' -f3 | cut -d' ' -f1) day=$(echo "$datetime" | cut -d':' -f3 | cut -d' ' -f1)
@ -57,10 +60,10 @@ log_change() {
photo="$1" photo="$1"
old_date="$2" old_date="$2"
new_date="$3" new_date="$3"
echo "File: $photo" >> "$log_file" echo "File: $photo" >> "$temp_file"
echo " Old Date: $old_date" >> "$log_file" echo " Old Date: $old_date" >> "$temp_file"
echo " New Date: $new_date" >> "$log_file" echo " New Date: $new_date" >> "$temp_file"
echo "" >> "$log_file" echo "" >> "$temp_file"
} }
# Loop through each year directory # Loop through each year directory
@ -89,15 +92,13 @@ for year_dir in "$base_dir"/*/; do
if [ -n "$filename_datetime" ]; then if [ -n "$filename_datetime" ]; then
new_date="$filename_datetime" new_date="$filename_datetime"
log_change "$photo" "No date metadata" "$new_date" log_change "$photo" "No date metadata" "$new_date"
echo "Updating date for: $photo" echo "Found: $photo"
echo " Extracted date from filename: $new_date" echo " Extracted date from filename: $new_date"
# exiftool -overwrite_original -DateTimeOriginal="$new_date" "$photo"
else else
new_date="$year:$month:01 00:00:00" new_date="$year:$month:01 00:00:00"
log_change "$photo" "No date metadata" "$new_date" log_change "$photo" "No date metadata" "$new_date"
echo "Updating date for: $photo" echo "Found: $photo"
echo " Defaulting to directory date: $new_date" echo " Defaulting to directory date: $new_date"
# exiftool -overwrite_original -DateTimeOriginal="$new_date" "$photo"
fi fi
else else
photo_year=$(echo "$photo_date" | cut -d':' -f1) 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 " Directory date: $year/$month"
echo " Photo date: $photo_date" echo " Photo date: $photo_date"
echo " Filename date: $filename_datetime" echo " Filename date: $filename_datetime"
echo " Updating photo metadata to match filename date." echo " Suggested action: Update photo metadata to match filename date."
# exiftool -overwrite_original -DateTimeOriginal="$new_date" "$photo"
fi fi
else else
echo "Mismatch found: $photo" echo "Mismatch found: $photo"
@ -142,9 +142,23 @@ for year_dir in "$base_dir"/*/; do
done done
# Ask for confirmation before proceeding to the next year # 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 if [[ "$response" != "y" ]]; then
echo "Stopping script." echo "Stopping script."
rm -f "$temp_file"
exit 0 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 fi
done done