Накопилось у меня куча неразобраных и разномастных фотографий которые
надо было как то разгрести. В ручную и даже с помощью digikam делать это
было неудобно и долго.
Пришлось написать небольшой скрипт для сортировки фотографий, который и выкладываю на ваш суд.
Скрипт раскладывает фотографии по каталогам вида гггг/мм/дд , изменяет разрешение и качество в соответствии с заданными параметрами, а так же переименовывает изображения в формат гггг_мм_дд-чч-мм-сс.jpg
На пример: /mnt/DCIM/IMG-20131014112354.jpg -> $HOME/Photo/2013/10/14/2013_10_14-11_23_54.jpg
photo_sort.sh
#!/bin/bash # Скрипт раскладывает фотографии по каталогам вида гггг/мм/дд, изменяет разрешение и качество в # соответствии с заданными параметрами, а так же переименовывает изображения в формат # гггг_мм_дд-чч-мм-сс.jpg # На пример: /mnt/DCIM/IMG-20131014112354.jpg -> $HOME/Photo/2013/10/14/2013_10_14-11_23_54.jpg # # Данные о дате снимка ищутся в следующем порядке: # 1) Exif данные (Exif.Photo.DateTimeOriginal и Exif.Image.DateTime) # 2) В названии фотографии. Распознает различные варианты написания даты # 3) Из даты создания файла # # При запуске без аргументов обрабатывает текущий каталог и все его подкатологи. В качестве аргумента # можно указать другой рабочий каталог-источник. # НЕ удаляет оригиналы изображений! # НЕ увеличивает разрешение # Для работы необходим пакет exiv2 (sudo apt-get install exiv2) ################################## src_dir=${1-`pwd`} # По умолчанию используется текущий каталог dst_dir=$HOME/Photo # Каталог в который будут скопированны обработанные фотографии quality=80 # Качество JPG изображения resize=1600x900 # Размер после конвертации # Ищем JPG файлы в указанной папке #find "$src_dir" -iname "*.jpg" -print0 | sort | while IFS= read -r -d $'\0' file ; do # Ищем JPG файлы в указанной папке и всех подпапках! find "$src_dir" -iname "*.jpg" | sort | while IFS= read -r file ; do # Пробуем взять дату из 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 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" # Создаем структуру папок гггг/мм/дд
# Копируем фотографию, только если исходный файл новее существующего
или отсутствует. При копировании сохраняется дата создания фотографии #cp -uvp "$file" "$dst_dir/$1/$2/$3/$1_$2_$3-$4_$5_$6.jpg" # Изменяем качество и размер фотографий, переименовываем и копируем в папку назначения convert -quality "$quality" -resize "$resize"\> -verbose "$file" "$dst_dir/$1/$2/$3/$1_$2_$3-$4_$5_$6.jpg" # Устанавливаем дату создания файла такую же как и дата в exif touch -t "$1$2$3$4$5.$6" "$dst_dir/$1/$2/$3/$1_$2_$3-$4_$5_$6.jpg" done exit 0
Данные о дате снимка ищутся в следующем порядке:
Exif данные (Exif.Photo.DateTimeOriginal и Exif.Image.DateTime) В названии фотографии. Распознает различные варианты написания даты Из даты создания файла
При запуске без аргументов обрабатывает текущий каталог и все его подкаталоги . В качестве аргумента можно указать другой рабочий каталог-источник.
НЕ удаляет оригиналы изображений
НЕ увеличивает разрешение
Для работы необходим пакет exiv2 и imagemagick (sudo apt-get install exiv2 imagemagick)
Для установки копируем код скрипта на пример в /usr/local/bin/photo_sort.sh
Даем права на исполнение sudo chmod +x /usr/local/bin/photo_sort.sh
Запускаем в нужной папке с фотографиями.
http://kubuntu.ru/node/11852