Я часто импортирую фотографии и видео (в основном с расширениями JPG и MOV) с цифровых камер и планшетов на мой компьютер, и в идеале я бы хотел, чтобы они были отсортированы по датам и времени, когда они были уже представлены в их данных 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"
Поэтому я надеюсь, что кто-то может найти лучшее решение. И было бы волшебно, если бы даже удалось преобразовать оригинальные имена файлов и расширения в нижний регистр!
Ответы:
Вы можете выполнить схему именования
sed
, чтобы заменить двоеточия тире, а пробелы символами подчеркивания, например:Что касается строчных букв, вы можете использовать
rename
:Или вы можете сделать это в вашем скрипте, используя
sed
:... а затем используйте
$j
переменную вместо финала$i
вашейmv
строки. Этот способ sed немного более переносим (если это важно для вас), поскольку разные дистрибутивы Linux имеют разные команды переименования, а sed универсален.Или, в качестве альтернативы, сценарий может быть изменен следующим образом, чтобы выполнить преобразование имени файла в нижний регистр в начале, используя
tr
вместо этого:Чтобы выполнить немного разные команды для разных типов файлов, в этом сценарии можно использовать оператор bash case. Например:
В этом примере переименование файлов MOV, имеющих метки времени CreateDate ЛЮБОЕ ЧИСЛО часов ПОСЛЕ ИЛИ ДО ДОПОЛНЕНИЯ JPG-файлов, корректируется с использованием других (-tur) EXIF-данных и удаления этого суффикса разницы во времени, и может потребоваться изменить часть -tur в соответствии с местоположением, установленным в системе.
источник
$i
чтобы$j
ничего не происходило). Вместо этого я вставил преобразование имени файла в нижний регистр в начале и позволил себе добавить это как еще один вариант (который работал по крайней мере для меня) в конец вашего ответа, чтобы я мог принять ваш ответ. Конечно, вы можете редактировать свой ответ дальше, как пожелаете.Мне нужно было переименовать мои фотографии и найти этот вопрос здесь - я только что узнал, что
exiftool
обрабатывает его изначально:От http://www.sno.phy.queensu.ca/~phil/exiftool/filename.html
Если вы хотите отслеживать исходное имя файла и писать расширение в нижнем регистре:
То же самое работает и со всем именем файла в нижнем регистре:
источник
Я знаю, что вы сказали, что предпочитаете скрипт, однако, если вы открыты для бесплатного Java-приложения, вы можете использовать AmoK Exif Sorter
источник
Я бы использовал
krename
для этого. Этоисточник
Pyrenamer не будет работать на моем новом установленном Ubuntu 16.04, поэтому я должен найти другой способ решить эту проблему.
У меня есть файлы, такие как IMG_0001.JPG, IMG_0002.JPG, ... в одной папке. Проверьте этот сайт, /programming/917260/can-var-parameter-expansion-expressions-be-nested-in-bash
Сначала установите exiv2, и я написал следующую командную строку:
для img в $ (ls *. [Jj] [Pp] [Gg] 2> / dev / null); do exiv2 -r '% Y% m% d_% H% M% S _' "$ (tmp = $ {img %%. *}; echo $ {tmp ## * _})" rename "$ img"; сделанный
Выходные имена файлов: YYYYMMDD_HHMMSS_0001.JPG, YYYYMMDD_HHMMSS_0002.JPG, ... и т. Д. Даже если фотографии были сделаны в одну секунду, оригинальный серийный номер фотографии будет иметь значение.
источник