Zmień nazwy obrazów na exif time: Twórz unikalne nazwy plików

11

Jeśli zmieniam nazwy obrazów przez exiv na datę i datę exif, wykonuję następujące czynności:

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

Teraz może się zdarzyć, że zdjęcia mają dokładnie ten sam znacznik czasu (w tym sekundy). Jak mogę automatycznie ustawić unikalną nazwę pliku?

Polecenie powinno być stabilne w tym sensie, że jeśli wykonam je ponownie w tej samej strukturze katalogów (być może po dodaniu nowych zdjęć), obrazy już zmienione nie powinny się zmieniać, a jeśli dodane zostaną zdjęcia z już istniejącymi nazwami plików, nowe nazwy plików powinny być unikalne także.

Moja pierwsza próba polegała na pozostawieniu oryginalnej nazwy basename w wynikowej nazwie pliku, ale wtedy polecenie nie byłoby stabilne w powyższym sensie.

student
źródło
1
Wyodrębnij znacznik czasu, skompiluj nazwę pliku, sprawdź istniejącą nazwę pliku, zmodyfikuj (dodaj sufiks lub podobny), jeśli jest obecny, a następnie mvplik.
Kusalananda
Czy istnieje również bardziej bezpośredni sposób, dodając opcję do polecenia exiv2?
student
Więc odpowiedź za pomocą exiftool byłoby coś takiego: exiftool '-filename<createdate' -d %Y_%m_%d__%H_%M_%S%%-c.%%le "-filemodifydate<createdate#" -r -progress .. Może mógłbyś zamienić swój komentarz w odpowiedź.
student

Odpowiedzi:

17

Może chcesz spróbować jheadzamiast który robi out-of-the-box (z a, b... zprzyrostki pozwalając maksymalnie 27 plików z tego samego dnia) i nie ma problemu stabilności wspomniany przez @meuh:

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

Lub używając exiftool(przykład na stronie podręcznika):

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

(tutaj z %-cprzyrostkiem liczbowym zaczynającym się od -)

Stéphane Chazelas
źródło
3

Moja wersja exiv2(0.25 001900) zapyta interaktywnie, co zrobić, gdy nazwa pliku już istnieje.

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

Dodając opcję -F, zamiast tego automatycznie doda dodatkowe _1(lub _2itp.) Do nazwy.

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

Jeśli polecenie zostanie uruchomione po raz drugi, powie:

This file already has the correct name

i nic nie robi, ale myli się, jeśli jest jakaś _1część, i zmienia jej nazwę _2. Będzie się tak przełączać w sposób nieniszczący przy każdym uruchomieniu. Możesz to zignorować, jeśli chcesz, lub zmienić findwzór, aby zignorować pliki pasujące do wzoru daty z _częścią.

Na przykład rozpoczyna się wzorzec wyrażenia regularnego dla formatu daty [0-9]{4}_[0-9]{2}_.... Aby uprościć, po prostu szukam kombinacji 20 znaków z zestawu 0..9i _, co jest wyrażeniem regularnym [0-9_]{20}. Do tego sufiks, _po którym następuje przynajmniej 1 cyfra do wyszukania, to _[0-9]{1,}.jpg. Ponieważ wyrażenie regularne musi pasować do całej ścieżki, a nie tylko do nazwy basename, końcowym wyrażeniem regularnym zawierającym katalog jest .*/[0-9_]{20}_[0-9]{1,}.jpg.

Możesz więc użyć znaleziska takiego jak:

find . -regextype posix-extended ! -iregex '.*/[0-9_]{20}_[0-9]{1,}.jpg' -iname '*.jpg' ...
meuh
źródło
1

Exiv2 poradzi sobie z tym samodzielnie. Sporo czasu poświęciłem również na szukanie pomocy, dopóki nie poszedłem zobaczyć instrukcji exiv2. Opcja -F rozwiązuje ten problem.

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

Na końcu dopisze _N, jeśli plik już istnieje.

A dla tych, którzy szukają opcji umożliwiającej utworzenie folderu.

exiftool -r '-FileName<DateTimeOriginal' -d %Y/%m/%d/%%f%%-c.%%e *
J.Adler
źródło
0

Pyrenamer nie będzie działał na moim nowym zainstalowanym Ubuntu 16.04, dlatego też muszę znaleźć inny sposób rozwiązania tego problemu.

Mam pliki takie jak IMG_0001.JPG, IMG_0002.JPG, ... w jednym folderze. Sprawdź tę stronę, /programming/917260/can-var-parameter-expansion-expressions-be-nested-in-bash

Najpierw zainstaluj „exiv2”, a ja napisałem następujący wiersz poleceń:

dla img w $ (ls *. [Jj] [Pp] [Gg] 2> / dev / null); wykonaj exiv2 -r '% Y% m% d_% H% M% S _' "$ (tmp = $ {img %%. *}; echo $ {tmp ## * _})„ zmień nazwę ”$ img”; gotowy

Wyjściowe nazwy plików to RRRRMMDD_GGMMSS_0001.JPG, RRRRMMDD_HHMMSS_0002.JPG, ... itd. Nawet zdjęcia zostały zrobione w tej samej sekundzie, oryginalny numer seryjny zdjęcia zrobi różnicę.

Chuck Lee
źródło