пятница, 26 июня 2009 г.

Сортировка фотографий

Часто бывает так, что на фотике собирается куча фотографий снятых в разные дни и по разному поводу. Сливаешь их потом на комп и начинаешь сортировать - от сих до сих тётя Глаша в гамашах, от тудова до сюдова брат Григорий на заборе. К тому же имена фотографий совершенно "не говорящие" - какой-нибудь DSC0075.JPG...

А бывает, что есть несколько наборов фотографий, например кто-то снимал параллельно с вами. Хорошо бы их объединить и отсортировать по времени, но дурацкие имена (DSC0075.JPG !) не дают этого сделать. Выход простой - переименовать файлы, что бы в начале имени была дата. Причём обязательно от старших компонент к младшим: год-месяц-день-час-минута-секунда, иначе, например для шаблона день-месяц-год никакой вменяемой сортировки не получится.

Короче, набросал небольшой скрипт, переименовывающий пачку JPEG файлов по шаблону '<дата> <время>.jpg' Плюс к этому он разбрасывает их по дням, если хорошо попросить.

Работает в Линуксе, что само собой и в Windows из под Cygwin. Нужно только не забыть установить утилиту exif.

Итак скрипт с пояснениями:

#!/bin/bash

# (1)
if [[ $1 == "-h" || $1 == "--help" ]]; then
echo "usage: $0 [-d] [name suffix]"
echo "option -d create directories for each day";
exit;
fi

# (2)
CREATE_DIR=0
if [[ $1 == "-d" ]]; then CREATE_DIR=1; shift; fi

# (3)
for f in *.jpg *.JPG; do

# (4)
if [[ $f == "*.jpg" || $f == "*.JPG" ]]; then continue; fi

# (5)
DATETIME=$(exif -i "$f" | grep 0x9003 | sed -r 's/.*\|//; s/:/-/g; s/ *$//')
DATE=$(exif -i "$f" | grep 0x9003 | sed -r 's/.*\|//; s/:/-/g; s/ *$//; s/ .*$//')
if [[ $DATE == "" || $DATETIME == "" ]]; then continue; fi

# (6)
[[ ! -d $DATE && $CREATE_DIR == "1" ]] && mkdir -p $DATE
echo $f

# (7)
DST="${DATETIME}${1}.jpg"
if [[ $CREATE_DIR == "1" ]]; then DST="$DATE/${DATETIME}${1}.jpg"; fi

# (8)
mv "$f" "$DST"
done


1. Покажем помощь, если попросят
2. Проверяем наличие опции -d, создающей директории на каждый день
3. Пробегаем по всем файлам *.jpg и *.JPG (Мой фотик почему-то любит большие буквы, а Линуксу это критично)
4. Если по маске не найдено ни одного файла, то переменной присваивается сама маска. Это как-то непонятно, логичнее было бы присвоить пустоту, но это так в zsh по крайней мере. Пропускаем эту маску.
5. С помощью утилиты exif вычитываем дату создания (тех 0x9003) и дату-время. Если они пусты, пропускаем файл.
6. Если была опция -d и нужной директории нет - создаём её.
7. Конструируем имя файла(jpg в нижнем регистре, итить его мать этот фотик). Если была опция -d, добавляем к имени "директорию дня"
8. Перемещаем файл.

Использовать так:
sort-photos.sh
Переименует все фотки в формат "<дата> <время>.jpg"


sort-photos.sh -d
Плюс ко всему рассортирует фотографии по дням.


sort-photos.sh ' Мой отпуск'
Добавит в имя файла суффикс. Не забудьте лидирующий пробел! Получится что-то вроде '2009-01-23 14-00 Мой отпуск.jpg'

6 комментариев:

Анонимный комментирует...

этож сколько нужно иметь терпения, чтоб ждать пока на фотоаппарате накопится туева хуча фоток???)))))
пару меяцев? если столь разные события... я свои практически сразу перебрасываю в отдельные папки и автоматически пишу число скидывания, если не помню дату праздника. хотя до такой степени тоже вроде не упивались)))))

Сергей Азаркевич комментирует...

Нужно не терпение, а лень :)

Анонимный комментирует...

Большое спасибо за скрипт, очень помог навести порядок с результатом 5-дневной съемки на 10 фотиков.

Анонимный комментирует...

Сергей Азаркевич! Может вы бы смогли бы опубликовать подробное расписание действий для чайников! а то очень надо, а программы нужной не найти...

Сергей Азаркевич комментирует...

Собственно скрипт не предназначен для чайников...

Но вообще всё просто. Копируем текст скрипта в файл, даём ему исполняемых прав и запускаем в консоли внутри директории с фотками.

Вот и всё :)

Анонимный комментирует...

Да,видимо я совсем чайник в подобном программировании! может все и просто,но лично я ни одного из перечисленных действий не могу сделать,т.к. почти все сочетания слов которые их определяют мне ни о чем не говорят)жаль...