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.
command-line
exif
student
źródło
źródło
mv
plik.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ź.Odpowiedzi:
Może chcesz spróbować
jhead
zamiast który robi out-of-the-box (za
,b
...z
przyrostki pozwalając maksymalnie 27 plików z tego samego dnia) i nie ma problemu stabilności wspomniany przez @meuh:Lub używając
exiftool
(przykład na stronie podręcznika):(tutaj z
%-c
przyrostkiem liczbowym zaczynającym się od-
)źródło
Moja wersja
exiv2
(0.25 001900) zapyta interaktywnie, co zrobić, gdy nazwa pliku już istnieje.Dodając opcję
-F
, zamiast tego automatycznie doda dodatkowe_1
(lub_2
itp.) Do nazwy.Jeśli polecenie zostanie uruchomione po raz drugi, powie:
i nic nie robi, ale myli się, jeśli jest jakaś
_1
część, 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ćfind
wzó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 zestawu0..9
i_
, 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:
źródło
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.
Na końcu dopisze _N, jeśli plik już istnieje.
A dla tych, którzy szukają opcji umożliwiającej utworzenie folderu.
źródło
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ę.
źródło