Перейменуйте зображення до exif time: Створіть унікальні імена файлів


11

Якщо я перейменую зображення через exiv на час дати exif, я виконую наступні дії:

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' ...

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 *

0

Піренамер не працюватиме на моєму новому встановленому 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); зробити exiv2 -r '% Y% m% d_% H% M% S _' "$ (tmp = $ {img %%. *}; echo $ {tmp ## * _})" перейменувати "$ img"; зроблено

Вихідні імена файлів - YYYYMMDD_HHMMSS_0001.JPG, YYYYMMDD_HHMMSS_0002.JPG, ... тощо. Навіть фотографії, зроблені в одну і ту ж секунду, оригінальний серійний номер фотографії зміниться.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.