Как переименовать несколько фотографий и видео на основе данных EXIF?

7

Я часто импортирую фотографии и видео (в основном с расширениями JPG и MOV) с цифровых камер и планшетов на мой компьютер, и я бы идеально хотел, чтобы они отсортировались в соответствии до дат и времени, в которые они были приняты , уже присутствующих в их EXIF-данных. И, следовательно, мое желание переименовать их все желательно с помощью простого Nautilus Script , предпочтительно вставляя метки даты и времени перед каждым именем файла.

Мне до сих пор удалось собрать только следующий сценарий Nautilus, который, я считаю, далек от совершенства:

for i in *.*
do
mv -i "$i" "$(exiftool -CreateDate "$i" | awk -F ': ' '{print }')_"$i"" 
done

То, что мне не нравится в этом методе переименования, это двоеточия, используемые в штаммах даты и времени EXIF ​​ (например, «2013: 09: 03 20: 55: 09_IMG_0108.JPG»), которые могут создавать проблемы при передаче этих файлов позже в другие среды (например, Windows).

Эта команда (с помощью exiv2 вместо exiftool ) удобно позволяет манипулировать метками даты и времени, но ее недостатком является то, что не работает на видео ( например MOV) :

exiv2 -k -r '%Y-%m-%d_%H-%M-%S_:basename:' rename "$i"

Поэтому я надеюсь, что кто-то может придумать лучшее решение. И было бы волшебным, если бы ему даже удалось конвертировать исходные имена файлов и расширения в нижний регистр!     

задан Sadi 15.09.2013 в 22:19
источник

4 ответа

6
  

То, что мне не нравится в этом методе переименования, - это двоеточия, используемые в штаммах даты и времени EXIF ​​(например, «2013: 09: 03 20: 55: 09_IMG_0108.JPG»), которые могут создавать проблемы при передаче этих файлов позже других средах (например, Windows).

Вы можете запустить схему именования через sed , чтобы заменить двоеточия тире и пробелы символами подчеркивания, например:

mv -i "$i" "$(exiftool -CreateDate "$i" | awk -F ': ' '{print }' | sed -e 's/:/-/g' -e 's/ /_/g')_$i"

Что касается всего нижнего регистра, вы можете использовать rename :

rename 's/(.*)/\L/' file.JPG
##  or
rename 's/(.*)/\L/' *.*

Или вы можете сделать это в своем скрипте, используя sed , как в:

j=$(echo "$i" | sed -e 's/\(.*\)/\L/')

... и затем используйте переменную $j вместо окончательного $i вашей mv . Этот способ sed немного более портативен (если это имеет значение для вас), поскольку разные дистрибутивы Linux имеют разные команды переименования, а sed - универсальные.

Или, альтернативно, сценарий может быть изменен следующим образом, чтобы преобразовать имя файла в нижний регистр в начале, используя вместо этого tr :

for arg 
do
  tmp="$(echo "$arg" | tr '[A-Z]' '[a-z]')"
  mv -i "$arg" "$(exiftool -CreateDate "$arg" | awk -F ': ' '{print }' | sed -e 's/:/-/g' -e 's/ /_/g')_$tmp"
done

Чтобы выполнить несколько разные команды для разных типов файлов, в этом скрипте может использоваться оператор case bash. Например:

#! /usr/bin/env bash
for filename in ./*
do
  tmp="$(echo "$filename" | tr '[A-Z]' '[a-z]')"
  case "$filename" in
    *.MOV|*.mov) 
      mv -i "$filename" "$(exiftool -a -s -CreateDate-tur "$filename" | awk -F ': ' '{print }' | sed -e 's/\-[0-9][0-9]\:00//g' -e 's/\+[0-9][0-9]\:00//g' -e 's/:/-/g' -e 's/ /_/g')_$tmp"
      ;;
    *.JPG|*.jpg)
      mv -i "$filename" "$(exiftool -a -s -CreateDate "$filename" | awk -F ': ' '{print }' | sed -e 's/:/-/g' -e 's/ /_/g')_"$tmp""
      ;;
    *)
      echo 'Not a *.jpg or a *.mov!'
      ;;
  esac
done

В этом примере переименование файлов MOV с отметками времени CreateDate ANY NUMBER часов ПОСЛЕ ИЛИ ПЕРЕД ДАННЫМИ файлами JPG настраивается с использованием других (-tur) EXIF-данных и удаления этого суффикса разницы во времени, и это может быть необходимо изменить -tur часть в соответствии с местоположением, установленным в системе.

    
ответ дан evilsoup 15.09.2013 в 23:00
источник
6

Мне нужно было переименовать мои фотографии и найти этот вопрос здесь - я только что узнал, что exiftool обрабатывает его изначально:

От Ссылка

exiftool -d %Y-%m-%d_%H-%M-%S%%-c.%%e "-filename<CreateDate" DIR 

Если вы хотите отслеживать исходное имя файла и нижний регистр расширения для расширений:

exiftool -d %Y%m%d_%H%M%S%%-c-%%f.%%le "-filename<DateTimeOriginal" [.|DIR]

То же самое работает и со всем именем файла в нижнем регистре:

exiftool -d %Y%m%d_%H%M%S%%-c-%%lf.%%le "-filename<DateTimeOriginal" [.|DIR]
    
ответ дан DerekC 23.12.2014 в 15:24
источник
1

Я использовал бы krename для этого. Это

  • показывает предварительный просмотр в прямом эфире
  • позволяет отменить
  • может перейти рекурсивно в каталог
  • позволяет несколько шаблонов переименования
  • разрешает глобусы и регулярные выражения в шаблонах
  • запомнить историю
ответ дан Adobe 16.09.2013 в 09:54
источник
1

Я знаю, что вы сказали, что предпочитаете скрипт, однако, если вы открыты для бесплатного Java-приложения, вы можете использовать AmoK Exif Sorter

    
ответ дан opticyclic 25.06.2014 в 15:21
источник

Ознакомьтесь с другими вопросами по меткам