Я часто импортирую фото и видео (в основном с расширениями 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"
Так что я надеюсь, что кто-то может найти лучшее решение. И было бы волшебно, если бы ему даже удалось преобразовать оригинальные имена файлов и расширения в нижний регистр!
Что мне не нравится в этом методе переименования, так это двоеточия, используемые в метках даты и времени EXIF (например, «2013: 09: 03 20: 55: 09_IMG_0108.JPG»), которые могут создавать проблемы при передаче этих файлы позже в другие среды (например, Windows).
blockquote>Вы можете запустить схему именования через
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 в соответствии с местоположением, установленным в системе.
Я знаю, что Вы сказали предпочтение сценария, однако, если Вы открыты для бесплатного JAVA-приложения, можно использовать сортировщика AmoK Exif
Мне нужно было переименовать мои фотографии и найти этот вопрос здесь - я только что обнаружил, что 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]
Я бы использовал krename
для этого.
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... и т.д. Даже фотографии были сделаны в ту же секунду, исходный фото порядковый номер будет иметь значение.