Advertisement
Lexeii

renexif

Oct 10th, 2011
161
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Bash 5.96 KB | None | 0 0
  1. #!/bin/bash
  2.  
  3. # 11-Oct-2011
  4.  
  5. # Author: Lexeii <al(dot)bobylev(at)gmail(dot)com>
  6. # Rename all jpg files in current folder according to EXIF date-time
  7. # in format YYMMDD_hhmmss.jpg
  8. # If filename consists letters then they adds to the end of new filename (after
  9. # dash). To avoid filename collision they appends with (2), (3) etc.
  10.  
  11. # Автор: Lexeii <al(точка)bobylev(собачка)gmail(точка)com>
  12. # Переименование всех файлов jpg в текущей папке согласно дате-времени из EXIF
  13. # в формате ГГММДД_ччммсс.jpg
  14. # Если в имени файла имеются буквы, то они добавляются через дефис в конце
  15. # имени. При совпадении имён, в конце дописывается (2), (3) и т.д.
  16.  
  17. # имя лог-файла основывается на имени этого скрипта и помещается в папку,
  18. # из которой вызывается этот скрипт
  19. LOGNAME="$PWD/$(basename $0).log"
  20. # создаём лог-файл при отсутствии
  21. touch "$LOGNAME"
  22.  
  23. # для всех файлов в текущей папке с расширениями JPG, jpg, JPEG и jpeg
  24. for filetek in *.{JPG,jpg,JPEG,jpeg}
  25. do
  26.     # получаем имя файла без расширения
  27.     name=$(echo "$filetek" | cut -d "." -f 1)
  28.     # когда файлы с расширением, например, JPEG, не найдены,
  29.     # в цикл поступают не имена файлов, а «*.JPEG», здесь отслеживаем это
  30.     if [ "$name" != "*" ]
  31.     then
  32.         # получаем значение тега «Date Time Original» из файла изображения.
  33.         # обычный формат строки:
  34.         # DateTimeOriginal             2011:07:29 12:20:14
  35.         # либо (реже)
  36.         # DateTimeOriginal             2011-08-05 12:49:41
  37.         # либо (еще реже)
  38.         # DateTimeOriginal             2011-07-30T17:06:49+03:00
  39.         #
  40.         # возможны некритичные ошибки при попытке извлечения данных XMP
  41.         #   (они всё равно не используются здесь)
  42.         # ключ -a в grep позволяет работать, даже если некоторые теги в EXIF
  43.         #   содержат не текстовые (бинарные) данные
  44.         # head берёт первое значение, в случае, когда они повторяются
  45.         # sed удаляет буквы, пробел, двоеточие и дефис, оставляя только цифры
  46.         dto=$(exiv2 pr -Pnv "$filetek" | grep -a "DateTimeOriginal" \
  47.               | head -n 1 | sed 's/[a-zA-Z\ :-]//g')
  48.         # убеждаемся, что полученное значение не пустое и не короче, чем
  49.         # 14 цифр, т.е. не должно содержать в себе непонятный мусор
  50.         if [ -n "$dto" ] && [ $(expr length $dto) -ge "14" ]
  51.         then
  52.             # из полученной строки в формате ГГГГММДДччммсс получаем:
  53.             # начиная с 3-ей цифры 6 цифр, подчеркивание и начиная с 9-й цифры
  54.             # 6 цифр. Получаем: ГГММДД_ччммсс
  55.             info=$(expr substr "$dto" 3 6)"_"$(expr substr "$dto" 9 6)
  56.  
  57.             # удаляем из имени файла (без расширения) всё кроме цифр,
  58.             # подчеркивания и дефиса
  59.             numname=$(echo "$name" | sed 's/[^0-9_-]//g')
  60.             # удаляем из исходного имени цифры, скобки, пробел и дефис, получая
  61.             # типично буквы, содержащиеся в имени (и некоторые другие символы)
  62.             abcname=$(echo "$name" | sed 's/[0-9_() -]//g')
  63.  
  64.             # если исходное имя содержит не только цифры (а и буквы также)
  65.             if [ "$name" != "$numname" ] && [ -n "$abcname" ]
  66.             then
  67.                 # новое имя в формате ГГММДД_ччммсс-буквы
  68.                 newname="${info}-${abcname}"
  69.             else
  70.                 # новое имя в формате ГГММДД_ччммсс
  71.                 newname="$info"
  72.             fi
  73.  
  74.             # если начало исходного имени (13 символов: ГГММДД_ччммсс) совпадает
  75.             # с началом нового имени, то переименование не требуется
  76.             # иначе продолжаем
  77.             if [ $(expr substr "$name" 1 13) != $(expr substr "$newname" 1 13) ]
  78.             then
  79.                 # число, которое будет стоять в конце имени в скобках
  80.                 # при полном совпадении имен
  81.                 nth="2"
  82.                 # запоминаем копию нового имени
  83.                 newnamecopy="$newname"
  84.                 # начинаем цикл, в котором создаём уникальное имя
  85.                 # за счёт подстановки в конец имени (2), (3) и т.д.
  86.                 while [ -e "${newname}.{JPG,jpg}" ]
  87.                 do
  88.                     # подставляем число в новое имя
  89.                     newname="${newnamecopy}($nth)"
  90.                     # увеличиваем число на единицу
  91.                     nth=$(expr "$nth" + 1)
  92.                     # возвращаемся к началу цикла и проверяем уникальность
  93.                 done
  94.  
  95.                 # выводим в консоль старое и новое имя
  96.                 echo "$filetek => ${newname}.jpg"
  97.                 # то же самое выводим в лог-файл (дописываем в конец файла)
  98.                 echo "$filetek => ${newname}.jpg" >> "$LOGNAME"
  99.                 # переименовываем исходный файл, расширение при этом будет
  100.                 # всегда «jpg» (маленькими буквами)
  101.                 mv "$filetek" "${newname}.jpg"
  102.             fi
  103.         fi
  104.     fi
  105. # повторяем цикл для других файлов
  106. done
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement