Oto odpowiedź na pytanie bonusowe.
Naprawdę chcę wstawić datę utworzenia zdjęcia do jego nazwy pliku, aby uzyskać coś w rodzaju 20091231 2359 New Year.jpg. Obawiam się, że potrzebuję nietrywialnej kombinacji poleceń, aby to osiągnąć?
Zakładając, że chcesz pobrać datę utworzenia zdjęcia z danych EXIF, potrzebujesz do tego osobnego narzędzia. Na szczęście okazuje się, że jhead
oferuje trywialny sposób robienia dokładnie tego, co chcesz, z jego -n
opcją.
$ jhead -h
[...]
-n[format-string]
Rename files according to date. Uses exif date if present, file
date otherwise. If the optional format-string is not supplied,
the format is mmdd-hhmmss. If a format-string is given, it is
is passed to the 'strftime' function for formatting
In addition to strftime format codes:
'%f' as part of the string will include the original file name
[...]
Oto przykład:
$ jhead -n%Y-%m-%d-%f New_year.jpg
New_year.jpg --> 2009-12-31-New_year.jpg
Edycja : Oczywiście, aby zrobić to dla wielu zdjęć, byłoby to coś takiego:
$ for i in *jpg; do jhead -n%Y-%m-%d-%f $i; done
Aby dostosować formatowanie daty do własnych upodobań, spójrz na date --help
przykład: wyświetli listę dostępnych kodów formatu.
(jhead jest szeroko dostępny dla różnych systemów. Jeśli używasz np. Ubuntu lub Debian, po prostu wpisz, sudo apt-get install jhead
aby go zainstalować.)
W przypadku części dotyczącej zmiany nazwy program „zmiana nazwy” będzie działał. Jest taki sam jak przykład, który widziałeś na stronie podręcznika, po prostu się zmieniłem.
źródło
Kluczem jest to, że jeśli widziałeś przykład pokazujący jak zamrozić jedną część nazwy pliku za pomocą wyrażenia regularnego, jest to jedyny potrzebny przykład. Rozszerzenia nie mają specjalnego statusu w systemach plików unix - są tylko częścią nazwy pliku, która występuje po
.
znaku.źródło
mv "$file" yourfile"${file#myfile}"
. Działa na dowolnej współczesnej powłoce Bourne'a (lub dowolnej powłoce POSIX), ale prawdopodobnie nie na rzeczywistej powłoce Bourne'a.Oto kilka innych sposobów manipulowania nazwami plików
Rozszerzenia parametrów w
mv
poleceniu działają w następujący sposób:${f%.*}
- Usuń najkrótszy pasujący wzór z końca ciągu zawartego w$f
, w tym przypadku usuń wszystko po ostatniej kropce włącznie. Singiel%
oznacza „najkrótszy od końca”.${f##*.}
- Usuń najdłuższy pasujący wzór z początku łańcucha zawartego w$f
, w tym przypadku wszystko przed ostatnią kropką i włącznie z nią (dotyczy to również innych kropek). Podwójne#
(##
) oznacza „najdłużej od początku”.Na przykład, jeśli
$f
zawiera „Foo.bar.baZ.jpg”:daje
i
daje
Tak więc
mv
polecenie po rozwinięciu będzie wyglądać następująco:źródło
f%
if##
są opisane tutaj, na przykład: tldp.org/LDP/abs/html/parameter-substitution.htmlW systemie Linux nie ma rozszerzeń nazw plików.
Użyj wyrażeń regularnych, aby wyciąć określone podciągi z nazwy pliku i uzyskać do nich dostęp.
Przykład:
Scenariusz z życia: wyodrębniasz html z pliku chm. W nazwach plików w systemie Windows wielkość liter nie jest rozróżniana, więc w systemie Linux będziesz mieć zepsute linki. Masz plik o nazwie index.HTML , ale href = „index.html” w adresach URL. Twoim celem jest więc dostosowanie nazw plików, aby dopasować do nich linki.
Załóżmy, że masz nazwę pliku w zmiennej:
Począwszy od wersji 3.0 bash obsługuje same wyrażenia regularne, więc nie potrzebujesz żadnych dodatkowych narzędzi, takich jak grep / sed / perl itp., Aby wykonywać operacje na łańcuchach. Poniższy przykład ilustruje zastąpienie dopasowania zaplecza w ciągu:
Ciągi dopasowania i zastępcze można sparametryzować, jeśli chcesz, zapewnia to dodatkową elastyczność podczas pisania skryptu. Poniższy fragment kodu osiąga ten sam cel:
Zapoznaj się z dokumentacją bash, aby uzyskać dodatkowe informacje.
źródło
Oto kolejna:
źródło
Zawsze jest na to więcej niż jeden sposób. Umieszczam następujący skrypt jako / usr / local / bin / mrename.
Następnie w skrypcie zawierającym pliki zdjęć po prostu wpisz: mrename
W skrypcie dostępna jest również opcjonalna funkcja komentowania w celu skalowania zdjęć (za pomocą ImageMagick).
Mam nadzieję, że jest to przydatne dla niektórych osób.
źródło
Możesz użyć tej
-X/--keep-extension
opcji zrename
(wersja 1.600):-X, --keep-extension Save and remove the last extension from a filename, if there is any. The saved extension will be appended back to the filename at the end of the rest of the operations.
rename
jest dostępny na Maca od Homebrew i na Linuxa od Linuxbrew (oczywiście oprócz innych opcji instalacji).źródło