Как-то столкнулся с тем, что все фотографии, которые я сливаю на synology с телефонов и фотоаппарата складываются в попку !impotr. Основная коллекция фото у меня храниться в папках формате YYYY-MM-DD, в файлах с именем IMG_YYYYMMDD-HHMMSS.jpg
Для автоматизации процесса нашел на просторах интернета и адаптировал для наших коробок небольшой скриптик.
Надеюсь, кому-то пригодиться.
К сожалению, на текущей реализации busybox не работает touch с параметром -d.
#!/bin/ash
# Скрипт раскладывает фотографии по каталогам вида гггг/мм/дд, изменяет разрешение и качество в
# соответствии с заданными параметрами, а так же переименовывает изображения в формат
# IMG_ггггммдд-ччммсс.jpg
#
# Данные о дате снимка ищутся в следующем порядке:
# 1) Exif данные (Exif.Photo.DateTimeOriginal и Exif.Image.DateTime)
# 2) В названии фотографии. Распознает различные варианты написания даты
# 3) Из даты создания файла
#
# При запуске без аргументов обрабатывает текущий каталог и все его подкатологи. В качестве аргумента
# можно указать другой рабочий каталог-источник.
# НЕ удаляет оригиналы изображений!
# Для работы необходим пакет exiv2
##################################
src_dir=${1-`pwd`} # По умолчанию используется текущий каталог
dst_dir=/volume1/photo # Каталог в который будут скопированны обработанные фотографии
# Ищем JPG файлы в указанной папке
#find "$src_dir" -iname "*.jpg" -print0 | sort | while IFS= read -r -d $'\0' file; do
# Ищем JPG файлы в указанной папке и всех подпапках!
find "$src_dir" -iname "*.jpg" | sed '/@eaDir/d' | sort | while IFS= read -r file; do
echo "Processing:" $file
# Пробуем взять дату из Exif.Photo.DateTimeOriginal или Exif.Image.DateTime
for photo_date in "Exif.Photo.DateTimeOriginal" "Exif.Image.DateTime"; do
photo_date=$(exiv2 -g "$photo_date" -Pv "$file")
if [ -n "$photo_date" ]; then # Если дата найдена, прекращаем перебор
break
fi
echo "Date for file" $file "is "$photo_date
done
if [ -z "$photo_date" ]; then # Если в exif дата не найдена ищем в названии файла
# Ищем дату в названии файла и приводим её к виду ггггммддччммсс
photo_date=$(basename "$file" ".jpg" | egrep -o -m1 [0-9]\{4\}\([-_:\ ]?[0-9]\)\{10\})
if [ -n "$photo_date" ]; then
# Приводим дату к виду гггг:мм:дд чч:мм:сс для корректного добавляения в exif
photo_date=$(echo "$photo_date" | tr -d "\_\-\:\ " | sed 's/\([0-9]\{4\}\)\([0-9]\{2\}\)\([0-9]\{2\}\)\([0-9]\{2\}\)\([0-9]\{2\}\)/\1:\2:\3 \4:\5:/')
# Добавляем дату из названия файла в exif
exiv2 -M"add Exif.Image.DateTime Ascii "$photo_date"" "$file"
else # Если даты в названии не нашли, берем дату изменения (создания) файла
photo_date=$(date +"%Y:%m:%d %T" -r "$file")
#exiv2 -M"add Exif.Image.DateTime Ascii $photo_date" "$file"
fi
fi
# Приводим различные вариации даты к единому виду гггг мм дд чч мм сс
photo_date=$(echo "$photo_date" | egrep -o -m1 [0-9]\{4\}\([-_:\ ]?[0-9]\)\{10\} | tr -d "\_\-\:\ " | sed 's/\([0-9]\{4\}\)\([0-9]\{2\}\)\([0-9]\{2\}\)\([0-9]\{2\}\)\([0-9]\{2\}\)/\1 \2 \3 \4 \5 /')
# Разбиваем полученную дату (гггг мм дд чч мм сс) на фрагменты
# $1 - Год, $2 - Месяц, $3 - День, $4 - Час, $5 - Минута, $6 - Секунда
set -- $photo_date
mkdir -p "$dst_dir/$1-$2-$3" # Создаем структуру папок гггг-мм-дд
# Копируем фотографию. Если файл с таким именем есть, выводится сообщение. При копировании сохраняется дата создания фотографии
if [ -f "$dst_dir/$1-$2-$3/IMG_$1$2$3-$4$5$6.jpg" ]; then
echo "SKIP '$dst_dir/$1-$2-$3/IMG_$1$2$3-$4$5$6.jpg' - File exists"
else
cp -vp "$file" "$dst_dir/$1-$2-$3/IMG_$1$2$3-$4$5$6.jpg"
fi
# Устанавливаем дату создания файла такую же как и дата в exif
# touch -d "$1$2$3$4$5.$6" "$dst_dir/$1-$2-$3/IMG_$1$2$3-$4$5$6.jpg"
done
exit 0