synology.forum архив спільноти · 2005–2022
ai.synology.forum →
ГлавнаяPhotoStation › Автоматическое переименование и перемещение фотографий

Автоматическое переименование и перемещение фотографий

Abi · 12.08.2014

Как-то столкнулся с тем, что все фотографии, которые я сливаю на 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