Często importuję zdjęcia i filmy (głównie z rozszerzeniami JPG i MOV) z cyfrowych aparatów fotograficznych i tabletów na komputer i idealnie chciałbym, aby były posortowane według dat i godzin, w których zostały już zapisane w danych EXIF. Dlatego pragnę zmienić ich nazwy, najlepiej używając prostego skryptu Nautilus , najlepiej wstawiając datę i godzinę przed każdą nazwą pliku.
Do tej pory udało mi się zebrać tylko następujący Skrypt Nautilusa, który moim zdaniem nie jest doskonały:
for i in *.*
do
mv -i "$i" "$(exiftool -CreateDate "$i" | awk -F ': ' '{print $2}')_"$i""
done
W tej metodzie zmiany nazwy nie podoba mi się dwukropek używany w znacznikach daty i godziny EXIF (np. „2013: 09: 03 20: 55: 09_IMG_0108.JPG”), które mogą powodować problemy podczas późniejszego przesyłania tych plików do innych środowisk ( np. Windows).
To polecenie (używając exiv2 zamiast exiftool ) wygodnie umożliwia manipulowanie znacznikami daty i godziny, ale jego wadą jest to, że nie działa na plikach wideo (np. MOV) :
exiv2 -k -r '%Y-%m-%d_%H-%M-%S_:basename:' rename "$i"
Mam nadzieję, że ktoś wymyśli lepsze rozwiązanie. Byłoby magiczne, gdyby udało się nawet przekonwertować oryginalne nazwy plików i rozszerzenia na małe litery!
Odpowiedzi:
Możesz uruchomić schemat nazewnictwa
sed
, aby zastąpić dwukropki myślnikami, a spacje podkreślnikami:Jeśli chodzi o małe litery, możesz użyć
rename
:Lub możesz to zrobić w skrypcie, używając
sed
:... a następnie użyć
$j
zmiennej w miejsce finał$i
twojejmv
linii. Ten sposób sedowania jest nieco bardziej przenośny (jeśli jest to dla Ciebie ważne), ponieważ różne dystrybucje linuksowe mają różne polecenia zmiany nazwy, podczas gdy sed jest uniwersalny.Ewentualnie skrypt można zmodyfikować w następujący sposób, aby na początku przeprowadzić konwersję nazwy pliku na małe litery, używając
tr
:Aby wykonać nieco inne polecenia dla różnych typów plików, w tym skrypcie można użyć instrukcji case bash. Na przykład:
W tym przykładzie zmiana nazwy plików MOV, które mają znaczniki czasu CreateDate DOWOLNĄ LICZBĘ GODZIN PO LUB PRZED plikami JPG, jest dostosowywana przy użyciu innych danych (-tur) EXIF i usunięcia tego sufiksu różnicy czasu i może być konieczna zmiana części -tur zgodnie z lokalizacją ustawioną w systemie.
źródło
$i
na$j
nic nie zrobiła). Zamiast tego na początku wstawiłem konwersję nazwy pliku na małe litery i mogłem dodać to jako kolejną opcję (która działała przynajmniej dla mnie) na końcu twojej odpowiedzi, dzięki czemu mogę przyjąć twoją odpowiedź. Oczywiście możesz dowolnie edytować swoją odpowiedź.Musiałem zmienić nazwę moich zdjęć i znalazłem to pytanie tutaj - właśnie dowiedziałem się, że
exiftool
obsługuje je natywnie:Ze strony http://www.sno.phy.queensu.ca/~phil/exiftool/filename.html
Jeśli chcesz śledzić oryginalną nazwę pliku i napisać małe litery rozszerzenia:
To samo działa również z całą nazwą pliku pisaną małymi literami:
źródło
Wiem, że powiedziałeś, że wolisz skrypt, ale jeśli jesteś otwarty na bezpłatną aplikację Java, możesz użyć AmoK Exif Sorter
źródło
Użyłbym
krename
tego. Toź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