ходили в поход, на группу было 3 фотоаппарата. Дошло дело до фоток - захотелось отсортировать изображения в хронологическом порядке.
Каждый фотык называет файлы по разному. Сортировать по датам модификации/создания файлов не получилось, т.к. они изменены при разных условиях(копирование на комп, редактирование и т.д.).
У каждой фотографии есть хранилище метаданных которое, насколько я понял, может быть отображено в разных форматах (EXIF,XMP). Полей там много, среди них: ескпозиция, была ли задействована вспышка, дата создания, дата оцифровки, и т.д.
Меня интересовала только дата создания, как потенциальный критерий для сортировки.
полез в порты:
Код: Выделить всё
[romzes] /usr/ports> make quicksearch name=exif
Port: exif-0.6.15
Path: /usr/ports/graphics/exif
Info: Command line utility to read and manipulate EXIF data
....
[romzes] /usr/ports> cd /usr/ports/graphics/exif && make install clean
Как выяснилось каждый фотоаппарат жил в своём собственном времени, но это не проблема - посмотрев фотографии, можно на глаз вычислить смещение времени между фотоаппаратами (взяв время какого-то одного за еталон), и привести даты EXIF всех фотографий, к общему времени и отсортировать по дате из EXIF.
решил, что буду корректировать дату создания в EXIF, и файлы называть так "CrimeaYYYYMMDDHHMM.SS.jpg".
был написан небольшой перловый скриптик:
Код: Выделить всё
#!/usr/bin/perl
#Префикс имени файла
$name_pr="Crimea";
#смещение времени. Например: "-v-1H -v-32M -v+18S" - уменьшить исходную дату на 1 час 32 минуты но увеличить на 18 секунд (подробнее man date )
$time_cor='-v-6H -v-3M';
#если не нужно изменять дату можно установить переменную так:
#$time_cor="";
#можно передавать скрипту несколько файлов на обработку, или в виде Photo012*
while (@ARGV) {
$ARGV= shift @ARGV;
print "file: $ARGV\n";
#Вытягиваем EXIF дату создания
$command='exif --ifd EXIF -t 0x9003 ' . $ARGV . q< | awk '/Value:/ {printf $2 " " $3}'>;
#Если раскомментировать, можно увидеть как будет выглядеть команда
#print "command: # $command\n";
$exif_date=`$command`;
# Корректируем полученную дату и конвертируем ее к виду YYYYMMDDHHMM.ss (здесь я зауважал команду date)
$command="date -j $time_cor " . ' -f "%Y:%m:%d %T" "' . $exif_date . '" "+%Y%m%d%H%M.%S"';
#Если раскомментировать, можно увидеть как будет выглядеть команда
#print "command: # $command\n";
@touch_date=split(/\n/,`$command`);
# То же что и предыдущая команда, только другой формат на выходе: YYYY:MM:DD HH:MM:SS
$command="date -j $time_cor " . ' -f "%Y:%m:%d %T" "' . $exif_date . '" "+%Y:%m:%d %H:%M:%S"';
#print "command: # $command\n";
@exif_date=split(/\n/,`$command`);
# записываем новую дату и меняем имя файла
# если файл на выходе и входной совпадают по имени - не удаляем старый
if ("$name_pr$touch_date[0].jpg" eq "$ARGV") {
$command='exif --ifd EXIF -t 0x9003 -o '. "$name_pr$touch_date[0].jpg" . ' --set-value "' . $exif_date[0] . '" '.$ARGV;
`$command`;
# если файл на выходе совпадает с другим существующим - добавляем суффикс
} elsif (-e "$name_pr$touch_date[0].jpg") {
$suffix=0;
while (-e "$name_pr$touch_date[0]$suffix.jpg") {
$suffix++;
}
$command='exif --ifd EXIF -t 0x9003 -o '. "$name_pr$touch_date[0]$suffix.jpg" . ' --set-value "' . $exif_date[0] . '" '.$ARGV;
`$command`;
print `rm -rf $ARGV`;
# если имя файла на выходе не совпадает с другими файлами - записываем.
} else {
$command='exif --ifd EXIF -t 0x9003 -o '. "$name_pr$touch_date[0].jpg" . ' --set-value "' . $exif_date[0] . '" '.$ARGV;
`$command`;
print `rm -rf $ARGV`;
}
}
отсортированные фото я ложу в директорию ~/Sorted
Код: Выделить всё
---захожу туда, куда складывать фото.
[romzes] /home/romzes> cd ~/Sorted
[romzes] /home/romzes/Sorted> which chtime.pl
/home/romzes/bin/chtime.pl
---редактирую смещение времени для каждого фотоаппарата
[romzes] /home/romzes/Sorted> vi ~/bin/chtime.pl
....
[romzes] /home/romzes/Sorted> chtime.pl ~/Anton/*
....
[romzes] /home/romzes/Sorted> vi ~/bin/chtime.pl
....
[romzes] /home/romzes/Sorted> chtime.pl ~/Vitalik/*
....
[romzes] /home/romzes/Sorted> vi ~/bin/chtime.pl
....
[romzes] /home/romzes/Sorted> chtime.pl ~/Yurets/*
....
Скрипт приведён в качестве примера и не претендует на более-менее приемлемый. Если все-таки решили его использовать бездумно - знайте: a) скрипт складывает out файлы в текущий каталог, если не указать иного в переменной $name_pr (напр. $name_pr="/home/romzes/photo/Crimea" - причем Crimea - префикс имени файла); b) исходные файлы удаляются.