04.03.2007

Цифровые фотографии. Наводим порядок.

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

Увы, я всего лишь обычный разгильдяй и потому мои фото были разбросаны по паре-тройке каталогов (в каждом из которых были подкаталоги типа "поездка на Киран" или "10.07.06" и т.п.) Для полноты картины, часть каталогов находилась на NTFS-разделе Windows, а часть - на ReiserFS-разделе Linux.
Чтобы окончательно уронить себя в глазах аккуратистов, добавлю - многие фотографии дублировались (берём фотоаппарат, копируем с него фото в один каталог, снимаем ещё, переносим с него фото в другой каталог) - и так до бесконечности.

Я надеюсь все уже прониклись ощущением того как всё запущено?

В один прекрасный день, когда я устал рыться по каталогам в поисках нужного фото (постоянно натыкаясь на дубликаты ненужных) было принято волевое решение - с беспорядком пора покончить. Раз и навсегда!

Сказано - сделано. Обработке подлежали как jpg-файлы, так и raw. И те, и другие содержали EXIF-информацию. Т.е. следовало часть этой информации из них извлечь и, исходя из неё, переименовать файлы (благодаря камере в этих каталогах содержалась куча файлов вида: P2100155.JPG).

Формат имени даты был принят таким: 20070717-145203.jpg, т.е. эта фотография была снята в 2007 году, 17 июля, в 14:52:03. Таким образом, фотографии автомагически сортируются в каталоге по дате, а дублирующиеся имена будут означать именно копию одного и того же снимка.

Итак, начнём подготовку к страшному колдунству.
В первую очередь нам понадобится пакет exifprobe. Его нам обеспечит заклинание:
$sudo aptitude install exifprobe


Немного поколдовав, создадим скрипт с таким содержимым:
#!/bin/bash
name=`exifprobe -L $1 | grep 'JPEG.APP1.Ifd0.DateTime' \
| awk '{print $3,$4}' | cut -c 2-20 | sed 's/://g' \
| sed 's/ /-/g'`.jpg
cp $1 ~/Фотографии/$name

Сделаем его исполняемым и будем запускать таким образом:
find /home/share/photos -iname *.jpg \
-exec /home/strannick/bin/script.sh {} \;

Команда find, покопавшись в /home/share/photos (или где там у вас свалка склад фото) находит все файлы с расширением *.jpg и копирует их в ~/Фотографии (или куда укажете в скрипте), одновременно переименовывая как было оговорено выше.

В результате, последовательно натравив find на все каталоги, где хранятся фотографии, мы получим все их в одном месте, без дубликатов и с осмысленными (относительно, разумеется) именами.
Теперь можно открывать окно Наутилуса (или любого другого графического файлового менеджера) и разбрасывать фотографии по тематическим каталогам. Ну, или оставить в общей куче. Это уж на ваш вкус.

Завершающим штрихом будет натравливание на этот каталог F-Spot'а (или Google Picasa), навешивание тэгов и прочая обработка.

P.S. Что касается raw-файлов, то их обработка практически ничем не отличается (нужно только сменить расширение в скрипте и в параметре поиска). Оставляю это желающим в качестве домашнего задания.
P.P.S. Может стоит вставить сюда пару-тройку скриншотов?

upd: вспомнилось, что ещё оставалась проблема - часть файлов имела расширение *.JPG, а часть - *.jpg. Поскольку дело было вечером - оставил на утро. А утром решение само пришло... На ловца и зверь бежит, да. :)

11 прокомментировало:

  1. Да...
    Не перестаю удивляться разнообразию человеческой природы. Мне даже в голову не могло прийти, что фотографии можно хранить где-то, кроме изначально систематизированного каталога. Опять же: я скорее уничтожу лишнее, чем обнаружу на винте хоть один jpeg в двух экземплярах. Причём, чем меньше осталось от "чернового" материала, тем удовлетворение - больше. Запасы и архивы утомляют меня самим фактом своего существования :). Возможно, этим всё и определяется?
    А подход - радует. Впрочем, об этом можно было и не говорить, наверное ? :)

    ОтветитьУдалить
  2. Собственно, всё просто - один раз скопировали всё с флэшки в один каталог.
    Через пару недель скопировали всё то же плюс нафотографированное ещё - в другой. :)

    Оно, конечно, неправильно, но так уж выходит...

    ОтветитьУдалить
  3. Не... "всё то же плюс..." у меня не бывает. Наверное, потому, что операция "по умолчанию" у меня move. Это для copy мне умственное напряжение требуется :)

    ОтветитьУдалить
  4. Круто!

    Я храню точно также - дублируются редко, но есть - когда лень было очищать флешку. Так и заливал на диски - с мыслями "авось потом разберусь" :).

    Про exif до меня бы не дошло, наверное :). Спасибо, полезный совет, принял на заметку.

    ОтветитьУдалить
  5. А разве пикаса почти тем же самым не занимается?:) Разве что локацию не меняет, и названия файлов, но при этом выстраивает все по датам и тд.

    ОтветитьУдалить
  6. Да, и Picasa, и F-Spot.

    Проблема была несколько в другом:
    а) дубликаты, разбросаные по разным каталогам;
    б) сама разбросанность по разным каталогам;
    в) неуникальные имена файлов;

    Мне кажется, описанный вариант ммм... элегантнее, что ли. :)

    ОтветитьУдалить
  7. Копирование с флешки - гораздо более правильная операция, чем перемещение, это очевидно. Не стоит слишком хорошо думать о производителях чипов: они не оптимизируют использование матрицы флешки, если только специально не делают это в дорогих версиях чипов. Так что однозначно лучше следить за равномерностью использования флешки самому, и не стирать с неё ничего до полного заполнения.
    Спасибо за интересную статью ;)
    PS: регистр имён файлов мне всегда помогает сменить Midnight Commander со своими shell patterns.

    ОтветитьУдалить
  8. Анонимный05 Март, 2007 15:36

    #!/bin/bash
    name=`exifprobe -L $1 | grep 'JPEG.APP1.Ifd0.DateTime' \
    | awk '{print $3,$4}' | cut -c 2-20 | sed 's/://g' \
    | sed 's/ /-/g'`.jpg
    cp $1 ~/Фотографии

    Добрый день!
    Я конешно дико извеняюсь ,но не совсем понятно как работает данный скрипт?
    Понятно что переменной name присваевается вывод того что в `` но! потом то как это используется? может всеже опечатка? и должно быть cp $name ~/Фотографии ? Вы не подумайте что спецально придираюсь просто тема хорошая и актуальная у самого такой же бордак с фотографиями....

    ОтветитьУдалить
  9. Тут есть одна тонкость: ни F-Spot, ни Picasa пока не умеют искать дубликаты. Для F-Spot, правда, вроде был патч.

    ОтветитьУдалить
  10. #!/bin/bash
    name=`exifprobe -L $1 | grep 'JPEG.APP1.Ifd0.DateTime' \
    | awk '{print $3,$4}' | cut -c 2-20 | sed 's/://g' \
    | sed 's/ /-/g'`.jpg
    cp $1 ~/Фотографии

    Добрый день!
    Я конешно дико извеняюсь ,но не совсем понятно как работает данный скрипт?
    Понятно что переменной name присваевается вывод того что в `` но! потом то как это используется? может всеже опечатка? и должно быть cp $name ~/Фотографии ? Вы не подумайте что спецально придираюсь просто тема хорошая и актуальная у самого такой же бордак с фотографиями....

    Пардон. Опечатка всё же вкралась.
    Принцип там предельно простой - выдираем строку "Дата - время" и выбрасываем из неё все лишние символы. Потом приписываем .jpg
    В результате, получаем имя файла вида:
    ГодМесяцДень-ЧасыМинутыСекунды.jpg

    Разумеется, последняя строка скрипта должна выглядеть так:
    cp $1 ~/Фотографии/$name

    ОтветитьУдалить
  11. Использую:
    pkg_info | grep p5
    p5-Image-ExifTool-6.76 Perl module for getting EXIF data from image files

    Написал самописный скриптик на его базе - доволен.

    ОтветитьУдалить