Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #!/bin/bash
- # 11-Oct-2011
- # Author: Lexeii <al(dot)bobylev(at)gmail(dot)com>
- # Rename all jpg files in current folder according to EXIF date-time
- # in format YYMMDD_hhmmss.jpg
- # If filename consists letters then they adds to the end of new filename (after
- # dash). To avoid filename collision they appends with (2), (3) etc.
- # Автор: Lexeii <al(точка)bobylev(собачка)gmail(точка)com>
- # Переименование всех файлов jpg в текущей папке согласно дате-времени из EXIF
- # в формате ГГММДД_ччммсс.jpg
- # Если в имени файла имеются буквы, то они добавляются через дефис в конце
- # имени. При совпадении имён, в конце дописывается (2), (3) и т.д.
- # имя лог-файла основывается на имени этого скрипта и помещается в папку,
- # из которой вызывается этот скрипт
- LOGNAME="$PWD/$(basename $0).log"
- # создаём лог-файл при отсутствии
- touch "$LOGNAME"
- # для всех файлов в текущей папке с расширениями JPG, jpg, JPEG и jpeg
- for filetek in *.{JPG,jpg,JPEG,jpeg}
- do
- # получаем имя файла без расширения
- name=$(echo "$filetek" | cut -d "." -f 1)
- # когда файлы с расширением, например, JPEG, не найдены,
- # в цикл поступают не имена файлов, а «*.JPEG», здесь отслеживаем это
- if [ "$name" != "*" ]
- then
- # получаем значение тега «Date Time Original» из файла изображения.
- # обычный формат строки:
- # DateTimeOriginal 2011:07:29 12:20:14
- # либо (реже)
- # DateTimeOriginal 2011-08-05 12:49:41
- # либо (еще реже)
- # DateTimeOriginal 2011-07-30T17:06:49+03:00
- #
- # возможны некритичные ошибки при попытке извлечения данных XMP
- # (они всё равно не используются здесь)
- # ключ -a в grep позволяет работать, даже если некоторые теги в EXIF
- # содержат не текстовые (бинарные) данные
- # head берёт первое значение, в случае, когда они повторяются
- # sed удаляет буквы, пробел, двоеточие и дефис, оставляя только цифры
- dto=$(exiv2 pr -Pnv "$filetek" | grep -a "DateTimeOriginal" \
- | head -n 1 | sed 's/[a-zA-Z\ :-]//g')
- # убеждаемся, что полученное значение не пустое и не короче, чем
- # 14 цифр, т.е. не должно содержать в себе непонятный мусор
- if [ -n "$dto" ] && [ $(expr length $dto) -ge "14" ]
- then
- # из полученной строки в формате ГГГГММДДччммсс получаем:
- # начиная с 3-ей цифры 6 цифр, подчеркивание и начиная с 9-й цифры
- # 6 цифр. Получаем: ГГММДД_ччммсс
- info=$(expr substr "$dto" 3 6)"_"$(expr substr "$dto" 9 6)
- # удаляем из имени файла (без расширения) всё кроме цифр,
- # подчеркивания и дефиса
- numname=$(echo "$name" | sed 's/[^0-9_-]//g')
- # удаляем из исходного имени цифры, скобки, пробел и дефис, получая
- # типично буквы, содержащиеся в имени (и некоторые другие символы)
- abcname=$(echo "$name" | sed 's/[0-9_() -]//g')
- # если исходное имя содержит не только цифры (а и буквы также)
- if [ "$name" != "$numname" ] && [ -n "$abcname" ]
- then
- # новое имя в формате ГГММДД_ччммсс-буквы
- newname="${info}-${abcname}"
- else
- # новое имя в формате ГГММДД_ччммсс
- newname="$info"
- fi
- # если начало исходного имени (13 символов: ГГММДД_ччммсс) совпадает
- # с началом нового имени, то переименование не требуется
- # иначе продолжаем
- if [ $(expr substr "$name" 1 13) != $(expr substr "$newname" 1 13) ]
- then
- # число, которое будет стоять в конце имени в скобках
- # при полном совпадении имен
- nth="2"
- # запоминаем копию нового имени
- newnamecopy="$newname"
- # начинаем цикл, в котором создаём уникальное имя
- # за счёт подстановки в конец имени (2), (3) и т.д.
- while [ -e "${newname}.{JPG,jpg}" ]
- do
- # подставляем число в новое имя
- newname="${newnamecopy}($nth)"
- # увеличиваем число на единицу
- nth=$(expr "$nth" + 1)
- # возвращаемся к началу цикла и проверяем уникальность
- done
- # выводим в консоль старое и новое имя
- echo "$filetek => ${newname}.jpg"
- # то же самое выводим в лог-файл (дописываем в конец файла)
- echo "$filetek => ${newname}.jpg" >> "$LOGNAME"
- # переименовываем исходный файл, расширение при этом будет
- # всегда «jpg» (маленькими буквами)
- mv "$filetek" "${newname}.jpg"
- fi
- fi
- fi
- # повторяем цикл для других файлов
- done
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement