init
This commit is contained in:
150
photos-metadata.sh
Executable file
150
photos-metadata.sh
Executable file
@@ -0,0 +1,150 @@
|
||||
#! /usr/bin/env nix-shell
|
||||
#! nix-shell -i bash -p bash exiftool
|
||||
|
||||
# Directory to start the search
|
||||
base_dir=~/Pictures/Photos/Camera
|
||||
log_file="metadata_changes.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
|
||||
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
|
||||
datetime="${BASH_REMATCH[1]}:${BASH_REMATCH[2]}:${BASH_REMATCH[3]} ${BASH_REMATCH[4]}:${BASH_REMATCH[5]}:${BASH_REMATCH[6]}"
|
||||
elif [[ "$filename" =~ ([0-9]{8})_([0-9]{6}) ]]; then
|
||||
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})([0-9]{6}) ]]; then
|
||||
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}) ]]; 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
|
||||
year=$(echo "$datetime" | cut -d':' -f1)
|
||||
month=$(echo "$datetime" | cut -d':' -f2)
|
||||
day=$(echo "$datetime" | cut -d':' -f3 | cut -d' ' -f1)
|
||||
hour=$(echo "$datetime" | cut -d' ' -f2 | cut -d':' -f1)
|
||||
minute=$(echo "$datetime" | cut -d':' -f5)
|
||||
second=$(echo "$datetime" | cut -d':' -f6)
|
||||
|
||||
# Remove leading zeros for validation
|
||||
year=$((10#$year))
|
||||
month=$((10#$month))
|
||||
day=$((10#$day))
|
||||
hour=$((10#$hour))
|
||||
minute=$((10#$minute))
|
||||
second=$((10#$second))
|
||||
|
||||
if (( year < 2009 || year > 2024 )) || (( month < 1 || month > 12 )) || (( day < 1 || day > 31 )) || (( hour > 23 )) || (( minute > 59 )) || (( second > 59 )); then
|
||||
datetime=""
|
||||
fi
|
||||
else
|
||||
datetime=""
|
||||
fi
|
||||
|
||||
echo "$datetime"
|
||||
}
|
||||
|
||||
# Function to log changes
|
||||
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"
|
||||
}
|
||||
|
||||
# Loop through each year directory
|
||||
for year_dir in "$base_dir"/*/; do
|
||||
year=$(basename "$year_dir")
|
||||
|
||||
# Exclude VFS directory
|
||||
if [ "$year" == "VFS" ]; then
|
||||
continue
|
||||
fi
|
||||
|
||||
# Loop through each month directory
|
||||
for month_dir in "$year_dir"*/; do
|
||||
month=$(basename "$month_dir")
|
||||
|
||||
# Loop through each photo in the month directory
|
||||
for photo in "$month_dir"*; do
|
||||
if [ -f "$photo" ]; then
|
||||
# Extract the date from the photo metadata
|
||||
photo_date=$(exiftool -DateTimeOriginal -d "%Y:%m:%d %H:%M:%S" "$photo" | awk -F': ' '{print $2}')
|
||||
|
||||
if [ -z "$photo_date" ]; then
|
||||
# Scenario 2: No date metadata
|
||||
filename_datetime=$(extract_datetime_from_filename "$photo")
|
||||
|
||||
if [ -n "$filename_datetime" ]; then
|
||||
new_date="$filename_datetime"
|
||||
log_change "$photo" "No date metadata" "$new_date"
|
||||
echo "Updating date for: $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 " Defaulting to directory date: $new_date"
|
||||
# exiftool -overwrite_original -DateTimeOriginal="$new_date" "$photo"
|
||||
fi
|
||||
else
|
||||
photo_year=$(echo "$photo_date" | cut -d':' -f1)
|
||||
photo_month=$(echo "$photo_date" | cut -d':' -f2)
|
||||
photo_day=$(echo "$photo_date" | cut -d':' -f3)
|
||||
|
||||
if [ "$photo_year" != "$year" ] || [ "$photo_month" != "$month" ]; then
|
||||
# Scenario 1: Date mismatch
|
||||
filename_datetime=$(extract_datetime_from_filename "$photo")
|
||||
|
||||
if [ -n "$filename_datetime" ]; then
|
||||
filename_year=$(echo "$filename_datetime" | cut -d':' -f1)
|
||||
filename_month=$(echo "$filename_datetime" | cut -d':' -f2)
|
||||
filename_day=$(echo "$filename_datetime" | cut -d':' -f3)
|
||||
|
||||
if [ "$photo_year" == "$filename_year" ] && [ "$photo_month" == "$filename_month" ]; then
|
||||
echo "Mismatch found: $photo"
|
||||
echo " Directory date: $year/$month"
|
||||
echo " Photo date: $photo_date"
|
||||
echo " Filename date matches photo date, file is in the wrong directory."
|
||||
echo " Suggested action: Move to $filename_year/$filename_month/$filename_day"
|
||||
else
|
||||
new_date="$filename_datetime"
|
||||
log_change "$photo" "$photo_date" "$new_date"
|
||||
echo "Mismatch found: $photo"
|
||||
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"
|
||||
fi
|
||||
else
|
||||
echo "Mismatch found: $photo"
|
||||
echo " Directory date: $year/$month"
|
||||
echo " Photo date: $photo_date"
|
||||
echo " No valid date found in filename."
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
done
|
||||
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
|
||||
if [[ "$response" != "y" ]]; then
|
||||
echo "Stopping script."
|
||||
exit 0
|
||||
fi
|
||||
done
|
||||
Reference in New Issue
Block a user