Массовая exifикация
Декабрь 19th, 2006 by Captain Flint
В продолжение поста Работа идет.
Со временем можно все немножко усложнить и приукрасить, поэтому то, что есть промаркирую версией 0.1. Всё раскидал по файлам т.к. лично мне так удобно
————————————————————————————–
$ pwd
/home/flint/bin
$ ls -l
...
-rwxr--r-- 1 flint flint 311 2006-11-11 23:01 exif_copyright
-rwxr--r-- 1 flint flint 268 2006-11-16 19:11 exif_dirname
-rwxr--r-- 1 flint flint 391 2006-11-16 19:15 exif_make
-rwxr-xr-x 1 flint flint 248 2006-11-11 23:44 exif_rotate
...
Пойдем по-порядку.
————————————————————————————–
$ cat exif_copyright
#!/bin/bash
#
# Программа для заполнения EXIF полей для jpeg файла
#
COPYRIGHT="Mysterya.Org"
OWNERNAME="Captain Flint & Mystery"
MAKERNOTE="Updated for Mysterya.Org"
exiftool -overwrite_original -P -Copyright="$COPYRIGHT" -OwnerName="$OWNERNAME" -MakerNote="$MAKERNOTE" $1
————————————————————————————–
$ cat exif_dirname
#!/bin/bash
#
# Программа для заполнения EXIF комментариев для jpeg файла
#
exiftool -overwrite_original -P -Comment="$(basename "$PWD" | translit)" $1
exiv2 -k -M"set Exif.Photo.UserComment $(basename "$PWD" | translit)" $1
————————————————————————————–
$ cat exif_rotate
#!/bin/bash
ROTATE=$(exiftool -AutoRotate -S $1 | awk -F: '{print $2}')
if [[ $ROTATE != None ]]; then
exiftool -overwrite_original -P -Orientation="$ROTATE" $1
exiftran -aip $1 && exiftool -overwrite_original -P -AutoRotate="None" $1
fi
Про вращение фоток скажу только, что есть команды и для автовращения, но не все (или не всегда) корректно очищают тэг AutoRotate после поворота, поэтому фотка может потом “повернуться” опять, при оказии %)
Идем дальше.
————————————————————————————–
$ cat exif_make
#!/bin/bash
shopt -s nullglob
for f in *; do
if [[ `file -b "$f"` == directory ]]; then
cd "$f"
"$0"
cd ..
else
exiv2 -k mv $f
fi
done
for f in *; do
if [[ `file -b "$f"` == directory ]]; then
cd "$f"
"$0"
cd ..
else
convert -resize 800x800 $f $f
exif_rotate $f
exif_copyright $f
exif_dirname $f
fi
done
————————————————————————————–
И для перекодировки с кириллицы в латиницу я пользуюсь тем, что знакомо - php:
$ pwd
/home/flint/bin
$ ls -l
...
-rwxr--r-- 1 flint flint 1474 2006-11-10 12:09 translit
...
————————————————————————————–
$ cat translit
#!/usr/bin/php -q
< ?
# [RU] Название скрипта: translit
# [RU] Конвертирует входную строку из текущей русской кодировки в транслит
# [RU] Написано в 2004 году Владимиром Дьяковым (vladimir.dyakov[ @ ]linux.alhimia.ru)
# [RU] Лицензия: GPLv2 или более поздняя
#
# Script name: translit
# Description: converts input text from current Russian encoding into translit
# Written in 2004 by Vladimir Dyakov (vladimir.dyakov[ @ ]linux.alhimia.ru)
# Lisence GPLv2 or later
list($lang,$charset) = split(".",getenv("LANG"));
$conv1 = array("а","б","в","г","д","е","ё","ж","з","и","й","к","л","м","н","о","п","р","с","т","у","ф","х","ц","ч","ш","щ","ъ","ы","ь","э","ю","я",
"А","Б","В","Г","Д","Е","Ё","Ж","З","И","Й","К","Л","М","Н","О","П","Р","С","Т","У","Ф","Х","Ц","Ч","Ш","Щ","Ъ","Ы","Ь","Э","Ю","Я");
$conv2 = array("a","b","v","g","d","e","jo","zh","z","i","j","k","l","m","n","o","p","r","s","t","u","f","h","c","ch","sh","sch","#","y","'","je","ju","ja",
"A","B","V","G","D","E","JO","ZH","Z","I","J","K","L","M","N","O","P","R","S","T","U","F","H","C","CH","SH","SCH","#","Y","'","JE","JU","JA");
$fp = fopen("php://stdin","r");
$a = "";
while ( ! feof($fp) ) $a .= fgetc($fp);
echo str_replace( $conv1, $conv2, $a );
?>
————————————————————————————–
Ну вот и всё.
Обрабатываем напильником до готовности, раскладываем фотки по каталогам (каталоги для удобства именуются кириллицей), из корня запускаем exif_make и ждем окончания процесса.
С удовольствием выслушаю отзывы и советы, особенно по делу
MysteryA. Наша жизнь
На всякий случай выложил всё это дело в архиве на форуме (http://forum.mysterya.org/uploads.php), только чтобы слить, региться надо.
А как на счет перекодировки с кирилицы в латиницы средствами bash? Не у всех есть php. Я честно говоря bash не сильно знаю. Учу потихоньку. В php все выглядит просто, неужели это нельзя реализовать в bash?
Вот честно скажу, не придумал способа как это сделать. Если какой-нить добрый человек подскажет, тоже буду весьма признателен. Конечно, думаю, можно и перлом, но я его, к сожалению, не знаю в достаточном объеме. А вот на баше было бы здорово.
http://www.linux.org.ru/books/lor-faq/lorFAQ-16.html
Там есть баш скрипт. Но у меня он выдает ошибку. Может Вы разберетесь.
Пробовал Ваш способ с php. Не могу понять. У меня есть папка с кучей файлов. Я хочу перегнать их в транслит. Что надо делать?
Вообще, предлагаю сместиться в форум: http://forum.mysterya.org/viewforum.php?id=11 ?
У меня тоже этот способ не прошел, поэтому я и искал другой.
Что за ошибку выдало? И какая у Вас локаль? (Может, лучше на “ты”, удобней как-то?..).
У меня UTF-8, и поэтому, насколько я помню, и не пошло.
Ok, на ты - это хорошо. Локаль у меня тоже UTF-8. Ошибку выдает “syntax error near unexpected token `then’” . Если немного подправить (смесить if … then на новую строку) - переводит, но…
с серега.mp3 делает yyymyyymyiyb.mp3.
Зерегистрировался на форум. Вот жду письма. Там все и обсудим.
Ок. Я там выложил, собственно, адаптированный скрипт с http://www.linux.org.ru/books/lor-faq/lorFAQ-16.html