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

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

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

for i in *.*
do
mv -i "$i" "$(exiftool -CreateDate "$i" | awk -F ': ' '{print $2}')_"$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"

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

9
задан 7 October 2013 в 19:52

5 ответов

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

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

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

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

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

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

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

... и затем использовать $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 $2}' | sed -e 's/:/-/g' -e 's/ /_/g')_$tmp"
done

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

#! /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 $2}' | 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 $2}' | sed -e 's/:/-/g' -e 's/ /_/g')_"$tmp""
      ;;
    *)
      echo 'Not a *.jpg or a *.mov!'
      ;;
  esac
done

В этом примере переименование файлов MOV, которые имеют метки времени CreateDate ЛЮБОЕ ЧИСЛО часов ПОСЛЕ ИЛИ ДО файлов JPG, корректируется с помощью других (-tur) данных EXIF ​​и удаления этого этот суффикс разницы во времени, и может потребоваться изменить часть -tur в соответствии с местоположением, установленным в системе.

0
ответ дан 7 October 2013 в 19:52

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

enter image description here

2
ответ дан 7 October 2013 в 19:52

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

Из http: //www.sno.phy.queensu. ca / ~ phil / exiftool / filename.html

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]
0
ответ дан 7 October 2013 в 19:52

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

  • показывает предварительный просмотр в реальном времени
  • позволяет отменить
  • может рекурсивно перейти в каталог
  • позволяет несколько шаблонов переименования
  • позволяет глобусы и регулярные выражения в шаблонах
  • помнит историю
0
ответ дан 7 October 2013 в 19:52

pyrenamer не будет работать над моей новой установленной Ubuntu 16.04, поэтому я должен найти другой способ решить эту проблему также.

У меня есть файлы, такие как IMG_0001.JPG, IMG_0002.JPG... в одной папке. Проверьте этот сайт, https://stackoverflow.com/questions/917260/can-var-parameter-expansion-expressions-be-nested-in-bash

Установите "exiv2" сначала, и я записал следующую командную строку:

для img в $ (ls *. [Jj] [Стр] [Строительное стекло] 2>/dev/null); сделайте exiv2-r' %Y%m%d _ % H%M%S _ '" $ (tmp= $ {img %%.*}; $ эха {tmp## *_})", переименовывают "$img";готово

Выходными именами файлов является YYYYMMDD_HHMMSS_0001.JPG, YYYYMMDD_HHMMSS_0002.JPG... и т.д. Даже фотографии были сделаны в ту же секунду, исходный фото порядковый номер будет иметь значение.

0
ответ дан 23 November 2019 в 04:49

Другие вопросы по тегам:

Похожие вопросы: