Переименование изображений в exif time: создание уникальных имен файлов

11

Если я переименую изображения через exiv в exif date time, я делаю следующее:

find . -iname \*jpg -exec exiv2 -v -t -r '%Y_%m_%d__%H_%M_%S' rename {} \;

Теперь может случиться, что фотографии имеют одинаковую метку времени (включая секунды). Как я могу сделать имя файла уникальным автоматически?

Команда должна быть стабильной в том смысле, что если я выполню ее снова в той же структуре каталогов (возможно, после добавления новых изображений), уже переименованные изображения не должны измениться, и если будут добавлены изображения с уже существующими именами файлов, новые имена файлов должны быть уникальными. также.

Моя первая попытка состояла в том, чтобы просто оставить исходное базовое имя в результирующем имени файла, но тогда команда не была бы стабильной в указанном выше смысле.

ученик
источник
1
Извлеките метку времени, создайте имя файла, проверьте существующее имя файла, измените (добавьте суффикс или аналогичный), если он присутствует, затем mvфайл.
Кусалананда
Есть ли более прямой путь, добавив опцию в команду exiv2?
студент
Таким образом, ответ , используя ExifTool будет что - то вроде: exiftool '-filename<createdate' -d %Y_%m_%d__%H_%M_%S%%-c.%%le "-filemodifydate<createdate#" -r -progress .. Может быть, вы могли бы превратить свой комментарий в ответ.
студент

Ответы:

17

Возможно, вы захотите попробовать jheadвместо этого то, что делает это «из коробки» (с суффиксами a, b..., zдопускающими до 27 файлов с одинаковой датой) и не имеет проблемы стабильности, упомянутой @meuh:

find . -iname '*jpg' -exec jhead -n%Y_%m_%d__%H_%M_%S {} +

Или используя exiftool(пример на странице man):

exiftool -ext jpg '-FileName<CreateDate' -d %Y_%m_%d__%H_%M_%S%%-c.%%e .

(здесь с %-cчисловым суффиксом, начинающимся с -)

Стефан Шазелас
источник
3

Моя версия exiv2(0.25 001900) в интерактивном режиме спросит, что делать, если имя файла уже существует.

exiv2: File `./2013_06_19__14_03_13.jpg' exists. [O]verwrite, [r]ename or [s]kip? 

Добавив опцию, -Fон вместо этого автоматически добавит дополнительную _1(или _2т. Д.) К имени.

Renaming file to ./2013_06_19__14_01_53_1.jpg, updating timestamp

Если команда запускается второй раз, она говорит:

This file already has the correct name

и ничего не делает, но он запутывается, если есть _1часть, и переименует ее _2. Он будет переключаться таким образом неразрушающим образом при каждом запуске. Вы можете игнорировать это, если хотите, или изменить свой findшаблон, чтобы игнорировать файлы, соответствующие шаблону даты с _деталью.

Например, начинается шаблон регулярного выражения для формата даты [0-9]{4}_[0-9]{2}_.... Чтобы упростить, я просто буду искать смесь из 20 символов из набора 0..9и _, который является регулярным выражением [0-9_]{20}. К этому следует добавить суффикс, за _которым следует не менее 1 цифры _[0-9]{1,}.jpg. Поскольку регулярное выражение должно соответствовать всему пути, а не только базовому имени, последнее регулярное выражение, включая каталог .*/[0-9_]{20}_[0-9]{1,}.jpg.

Таким образом, вы можете использовать поиск как:

find . -regextype posix-extended ! -iregex '.*/[0-9_]{20}_[0-9]{1,}.jpg' -iname '*.jpg' ...
meuh
источник
1

Exiv2 может справиться с этим самостоятельно. Я также потратил много времени в поисках помощи по этому вопросу, пока не пошел посмотреть руководство exiv2. Опция -F решает эту проблему.

exiv2 -r'%Y_%m_%d__%H_%M_%S' -F *.jpg

Он добавит _N в конце, если файл уже существует.

И для тех, кто ищет вариант, позволяющий создать папку.

exiftool -r '-FileName<DateTimeOriginal' -d %Y/%m/%d/%%f%%-c.%%e *
J.Adler
источник
0

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, ... и т. Д. Даже если фотографии были сделаны в одну секунду, оригинальный серийный номер фотографии будет иметь значение.

Чак Ли
источник