Из недавнего отпуска я привез около 500 фотографий (цифровых, конечно, не на пленках :-) ). Сегодня принялся приводить их в порядок: удалять ненужные и распределять оставшиеся в директории по дням отпуска. Кто этим занимался знает, что делать это вручную слегка муторно, особенно сливать в одну папку файлы из двух разных заходов фотографирования, когда у них в исходных директориях совпадают имена. А вот удобной утилитки для этого я как-то не знаю...
Однако, мне удалось затратить на это что-то около пары часов. Хочу поделиться технологией.
Технология
Я воспользовался Питоном. В его комплекте поставки есть интерфейс командной строки, где можно выполнять операторы языка и целые скрипты в интерактивном режиме. Это очень удобно, потому что не тратится время на бесконечное "поправил-скомпилировал-проверил", которое свойственно компилируемым языкам. И не подумайте, что это исключительно юниксовая штука, Питон прекрасно работает и на Windows, и на Mac'е.
Так вот, я загрузил этот интерфейс и стал прямо там считывать с диска дирекотрии с фотками и пошагово делать всякие перемещения-переименования. Как только последовательность действий была отлажена, я собрал все строчки вместе в окошке текстового редактора и стал просто copy-paste'ить их в командную строку Питона, заменяя названия директорий.
Сначала надо было слить фотки из нескольких поддиректорий-частей одного дня в общий список с переименованием по порядку:
count=1
folder='16.10.2005/'
# Повторить для каждой поддиректории 'part N'
files=os.listdir(path+folder+'part 1')
files.sort()
for f in files:
os.rename(path+folder+'part 1/'+f,path+folder+'%03d.jpg'%count)
count+=1
Потом составлял отдельную директорию-альбом некоторых избранных фоток. В нее попадали фотки из разных дней, поэтому в ней тоже могли мешаться одинаково называющиеся файлы. Чтобы это обойти, я каждый раз, после копирования в эту директорию файлов одного дня запускал скриптик, который переименовывает новые фотки в порядке поступления, но немножко в другом виде, чтобы переименованные отличались от новых (просто "_" добавлял в начале):
count=1
folder=path+'album/'
#Повторить после каждого копирования новых фоток
files=[f for f in os.listdir(folder) if not f.startswith('_')]
files.sort()
for f in files:
os.rename(folder+f,folder+'_%03d.jpg'%count)
count+=1
Вот таким вот образом.
Мораль
Вообще говоря, еще в отпуске прямо на пляже Jim озадачил меня вопросом переименования и подкинул идею написать простенькую тулзу, которая бы автоматизировала подобные действия. Я, правда, сразу отказался :-).
Дело в том, что написание такой тулзы, даже постенькой, займет времени куда больше, чем та пара часов, которую я потратил с Питоном.
Во-первых, надо рисовать интерфейс. А во-вторых, в тулзе, поскольку она предназначена не для моих конкретных семи директорий, а для общих случаев, придется программировать тучу специфических ситуаций:
- Узнавать, какие поддиректории внутри директорий дней принимать во внимание, и в каком порядке.
- Следить за файлами, которые уже переименованы и устанавливать счетчик так, чтобы новые не налезали на старые.
- ...
А потом, после всего этого придет в голову мысль, что надо вообще не по исходной структуре ориентироваться, а просто брать всю толпу фоток, считывать из JPEG'ов время фотографирования и просто распихивать их в порядке снятия в новую структуру директорий. А это значит, что надо идти искать библиотечку по чтению EXIF и читать, как ею пользоваться. В общем, черт его знает, сколько это все займет :-).
Сейчас же я всю эту логику по поиску директорий и сбрасыванию счетчика "реализовал" вручную, и это оказалось проще, чем думать, как это спрограммировать.
Комментарии: 12
Кстати, код в RSS ленте почемуто написался весь в одну строчку =(
Пришлось заходить на Блог и выяснять детали =)
Я для таких вещей пользуюсь Рексом. В том числе есть и программулька для той же самой цели.
(в сторону) Жаль что IBM не смогла реализовать его потенциал.
Всё можно сделать проще с программками jhead и jtran
по указанным в командной строке правилам пронумеруют, переименуют (могут читать из EXIF, автоматически открутят в вертикальное положение.
Вообще-то, в телефоне есть часы, согласно которым выставляется дата сохраняемых файлов (фоток). На основании этой даты с помощью подручных средств (find, cp/mv) все вышеописанное делается крайне элементарно. Если нужно что-то извлекать из exif (комменты? Или что там еще может понадобится?), то можно найти, думаю, еще одну консольную прожку, умеющую это. В итоге, простейший bash-скрипт, созданный на коленке за пару минут.
Python тут - гаубица против комара.
P.S. esearch exif выдал минимум 2 консольные проги, по названию, реализовывающие нужное.
P.P.S. Если кто не понял, я имел ввиду Linux. В частности, Gentoo Linux.
Поздравляю с питоном, но с софтом, который идет с камерой видимо не повезло :(. У меня Canon, так вот если устанвить их фирменный софт для работы с камерой - достаточно нажать кнопку на фотике, когда он подключен к компу - все фотографии будут переданы и рассортированы как надо. А насчет переименований (а особенно групповых) - есть готовые утилиты, которые встроены, в том числе и просмотрщики графики. Иногда не нужно стрелять по воробьям из пушки, хотя для сохранения мозгового тонуса - это полезно. Только долго...
Время модификации файлов может измениться при всяких предварительных операциях с ними (разворот в вертикальную ориентацию, копирование чего-то туда сюда).
Насчет пушки и воробьев. Я понимаю, что это для большинства нормальных людей так и выглядит, но для меня это как раз самый удобный и действительно легкий инструмент оказался :-)
За все наводки и советы спасибо!
да уж.. мне тут сразу вспомнилась ВыньХП - подрубаешь фотик, говоришь скопировать изображения и она сама все переименовывает и копирует :)
конечно настроек особых нет, exif тоже вроде не читает. но все копируется на раз два.. и 99% юзеров наверно устраивает...
а ты тут "всего пару часов" потратил :))
ЗЫ. сам я этой тулзой от ХП не пользовался ни разу ;) (у меня фотки делятся по дате скидывания на веник+небольшой комент по событию)
Не, ребят, вы не поняли :-). С копированием из фотоаппарата проблем нет. Все точно также: вставляешь фот, вылезает окошко, где выбираешь директорию, куда сливать.
Проблема потом возникает. Каждый день фотки сливаются и стираются из фотоаппарата несколько раз. Попадают в разные директории. Вот потом хочется это перераспихать и объединить. Вот тут и получается пара часов. Вместе с выбором какие убрать, какие оставить, какие может быть из синего спектра слегка вывести и т.д.
Питон - это конечно клёво :)
Респект за “всего пару часов” :)
ВинХР - не то тоже...
ACDSee: Выделяешь все файлы, нажимаешь F2, задаёшь схему переименования.. всё.
Главное, чтобы даты нормальные у фоток были, тогда сначала самое главное из засунуть в одну папку с любыми именами фоток, а потом, отсортировав по дате переименовать уже как надо.
А вообще на фотике есть фича - начинать заново именование фоток или продолжать...
ЗЫ Тожа как-то думал тулзу на пхпе написать - музыку рассортировать, и с id3-тегами разобраться... забил. Лучше чего-нить рабочее более-менее найти.. А то если уж писать, то писать, чтобы !работала! всегда, со всем, в любых условиях - тут до следующего отпуска будешь маяться :)
С уважением.
http://www.herve-thouzard.com/modules/wfsection/article.php?articleid=1
Умеет читать EXIF, MP3, WAV, WMA и др.
Спасиб. Я, правда, для EXIF'а уже нашел другую: http://home.cfl.rr.com/genecash/digital_camera.html
http://picasa.google.com/intl/ru/ Гуглевская програмка для работы и обработки фотографий.