Еще один глупый скрипт для сортировки фотографий по EXIF под *nix

    Как-то так получилось, что на домашней файло-помойке скопилось 20Гб фотографий в не отсортированном виде. Причем, если в последнее время я и дочка пользуемся EOS Utility и она аккуратно складывает фотографии по годам/месяцам/дням, то все фотографии ранее и с других фотоаппаратов просто сваливались в различные поддиректории. Соответственно захотелось причесать этот бардак, для чего был и сделано следующее:

    1. Установлен пакет exifprobe (Он читает информацию об EXIF )
    2. Написан скриптик «sort_by_exif_date.sh»:
    #!/bin/bash
    if [ -f "${1}" ]
    then
    CurrDate=`/usr/bin/exifprobe -L "${1}" | awk 'BEGIN {DateTime=""} /DateTime/{DateTime=$3} END{print DateTime}' | sed s/\'//g`
    ToPath=`echo ./${CurrDate}/ | sed 's/:/\//g'`
    if [ "$CurrDate" = "" ]
    then
    ToPath="./Unknown/"
    fi

    mkdir -p ${ToPath}
    mv "${1}" ${ToPath}
    Cmd=""${1}" To ${ToPath}"
    echo ${Cmd}
    fi

    3. Запущено вот такое:
    find. -path "./200[1234567890]" -prune -o -exec ~/bin/sort_by_exif_date.sh {} \;
    4. И почищены пустые директории (удалились только пустые):
    find. -type d -exec rmdir "{}" \;


    В результате все фотографии, имевшии exif информацию, разложились по папочкам, все неопознанное упало в папку Unkonown.

    Таким образом, о добрый %USERNAME%, я уменьшил меру Хаоса на одной отдельно взятой файло-помойке.
    AdBlock похитил этот баннер, но баннеры не зубы — отрастут

    Подробнее
    Реклама

    Комментарии 29

      +1
      о! весьма.

      а можно же ещё сделать touch файла этой датой и потом соритровать уже по дате изменения файла.

      ну и вместо awk наверно проще былобы сделать grep 'DateTime' | cut -f3
        +1
        А дело в том, что там несколько этих DateTime, в зависимости от модели фотоаппарата, и хотелось выбрать самую последнюю дату. И вроде там сначала была более сложная программа на awk, потом я ее укоротил. Да, про touch мне в голову мысль не пришла :(
        Логично, кстати было-бы!
          0
          последнее: tail -n1 :)
          но последняя по встречаемости не значит последняя по времени.

          а так, если поглядеть, то если есть DateTimeOriginal/DateTimeDigitized,
          то есть и просто DateTime, которое последнее по дате.
            +1
            Ну в общем да, можно было не выпендриваться с awk-ом. Но уж больно я к нему не равнодушен :)
              0
              мне недавно открыли глаза, оказывается есть такой gawk и работает он в разы быстрее того же awk
                0
                Это касалось SCO Unix, насколько я знаю, под всеми линуксами уже gawk и используется. Хотя, может я чего и путаю.
                  0
                  Мне больше nawk нравится.
          +1
          а ещё бывают фотики с коряво выставленной датой.
          (наступали на эти грабли, когда чистилка сносила их с сервера как устаревшие)
            0
            Дата и время для фоток на веб сервисах — вообще отдельная песня.
            1. Кривое время — это когда батареи например садятся или что нибудь перезапускается — тогда время по умолчанию в камере ставится.
            2. Круглая Земля с разными временными зонами. С этим столкнулись, когда с треками GPS увязывали (UTM там всегда). А изготовители камер до недавнего времени об этом, похоже, не подозревали :)

            Вообще exif интересная тема.

            Мои +1 и спасибо автору
              0

              Вот тоже много думал об этих датах. Хорошо бы при разгребании такие аномалии автоматически находить и предлагать упорядочивать.


              Что характерно, тут есть несколько типичных кейсов:


              1. Дата на фотоаппарате слетела при смене батареек.
                В этом случае фотографии относительно друг-друга выстраиваются по времени пропорционально и правильно. Достаточно привязать один кадр такой серии к реальной дате/времени, а остальные можно рассчитать и привязать автоматом.
                Важно обнаружить момент, когда дата слетает посередине серии так, что часть фоток улетают на несколько лет в прошлое. Как на косвенный признак такой ситуации можно опираться на порядковый номер фото и её положение в исходных каталогах в файлопомойке.
              2. Дата/время сдвинуты из-за приблизительной установки. Серия в целом отображается в таймлайне где надо, и (при наличии опорного кадра, где были засняты часы) можно восстановить точное время всей серии.
              3. Дата/время установлены по некорректному часовому поясу во всей серии или её частях. Можно, к примеру, предусмотреть возможность ручной установки в таймлайне с фотографиями маркеров смены часового пояса.
              4. Сочетание всех вышеперечисленных случаев из-за слияния в куче каталогов фоток из разных источников. Самый неприятный случай, когда большая шумная компания сливает все свои фотки в кучу, потом самый инициативный еще и разгруппирует по людям или по каким-то еще не очевидным признакам. Тут надо, наверно, какое-то автотегирование по модели и серийному номеру фотика, группировку источников… Ну и адаптацию решений вышеперечисленных проблем к такому вот сложному случаю.
            0
            Хороший скриптик, молодец. Но думаю место этому посту в Linux для всех
              0
              Ну почему в Linux-то? Это и под леопардом работает. Правда, я думаю, что там это можно сделать парой кликов :)
                0
                Ок, тогда в bash :)
              0
              sed 's/:/\//g' -> sed 's|:||g'
                0
                Нет, не подходит, оно не то делает:
                echo «2006:01:12» | sed 's|:||g'
                20060112
                А надо, чтобы получилось 2006/01/12
                :)

                  +1
                  -=>> echo 2006:01:12 | sed 's|:|/|g'
                  2006/01/12
                    0
                    Действительно, спасибо. А я вечно прямолинейно, по-дуболомски, маскирую эти слеши.
                0
                Вообще наиболее правильное средство для работы с EXIF — Perl exiftool. Оно умеет работать с TIFF и RAW, знает про всевозможные теги специфичные для разных камер, всякие хитрые форматы метаданных вроде XMP. Плюс умеет выводить данные в формате для скриптов, благодаря чему не нужны игры с sed
                  0
                  Так-то оно так, но я не знаю перл, он появился позже awk-а, и мне не хочется его учить.
                    0
                    я тоже perl не знаю, использую command line утилиту от этого пакета в скриптах на shell/sed/awk
                      0
                      Понятно! Я в пакетах видел эго, но подумал, что не знаю перла, поэтому его даже и не ставил. Ясно, век живи — век учись.
                        0
                        s/эго/его/g
                  0
                  В Gnome можно сделать то же самое, импортировав все фотографии с помощью F-Spot (включив птичку «Копировать фотографии в папку»).
                    0
                    Понял, спасибо, но у меня нет там Х11, только АЦТ :)

                    0
                    man jhead
                    jhead -n%Y%m%d-%H%M%S *.jpg This will rename files matched by *.jpg in the format YYYYMMDD-HHMMSS
                      0
                      А если с четырых фотоаппаратов, делавших серии по 5 кадров в секунду надо упорядочить снимки?
                      0
                      про 5 кадров в секунду — jhead добавит при переименовании суффикс a,b,c,d,e
                      ну а дальге — тоже костылями раскидывать по папкам
                        0
                        Автор молодца, скриптик очень своевременный, я все же остановился вот на таком варианте:
                        exiftool -r '-Directory<DateTimeOriginal' -d /path_to/%Y/%Y.%m.%d /path_from/
                        


                        Для установки exiftool в gentoo, достаточно сказать:
                        emerge exiftool
                        а в ubuntu:
                        aptitude install libimage-exiftool-perl

                          0

                          А давайте помозгоштурмим требования к ИДЕАЛЬНОЙ CLI утилите для работы с фотоколлекциями.
                          Я вот набросал свои хотелки тут.
                          Постепенно разгребу всё это, выделю MVP и по 5 минут в неделю буду выкраивать=)

                          Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                          Самое читаемое