Hier ist eine Antwort auf die Bonusfrage.
Ich möchte das Erstellungsdatum eines Fotos in seinen Dateinamen einfügen, um so etwas wie 20091231 2359 New Year.jpg zu erhalten. Ich fürchte, ich brauche eine nicht triviale Kombination von Befehlen, um das zu erreichen?
Angenommen, Sie möchten das Erstellungsdatum des Fotos aus den EXIF-Daten übernehmen, benötigen Sie dafür ein separates Tool. Glücklicherweise stellt sich heraus, dass jhead
dies mit seiner -n
Option eine triviale Möglichkeit bietet, genau das zu tun, was Sie wollen .
$ 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
[...]
Hier ist ein Beispiel:
$ jhead -n%Y-%m-%d-%f New_year.jpg
New_year.jpg --> 2009-12-31-New_year.jpg
Bearbeiten : Um dies für ein paar Fotos zu tun, wäre es natürlich so etwas wie:
$ for i in *jpg; do jhead -n%Y-%m-%d-%f $i; done
Schauen Sie sich date --help
zum Beispiel die Ausgabe von an , um die Datumsformatierung nach Ihren Wünschen anzupassen . Es werden die verfügbaren Formatcodes aufgelistet.
(jhead ist für verschiedene Systeme weit verbreitet. Wenn Sie z. B. Ubuntu oder Debian verwenden, geben Sie einfach ein sudo apt-get install jhead
, um es zu installieren.)
Nur für den Umbenennungsteil funktioniert das Programm "Umbenennen". Es ist das gleiche wie das Beispiel, das Sie auf der Manpage gesehen haben, nur umgeschaltet.
quelle
Der Schlüssel ist, dass, wenn Sie ein Beispiel gesehen haben, das zeigt, wie ein Teil des Dateinamens mit einem regulären Ausdruck versetzt wird, dies das einzige Beispiel ist, das Sie benötigen. Erweiterungen haben auf Unix-Dateisystemen keinen besonderen Status - sie sind nur ein Teil des Dateinamens, der zufällig nach einem
.
Zeichen steht.quelle
mv "$file" yourfile"${file#myfile}"
. Funktioniert mit jeder modernen Bourne-ähnlichen Shell (oder jeder POSIX-Shell), aber wahrscheinlich nicht mit der eigentlichen Bourne-Shell.Hier sind einige weitere Möglichkeiten, um Dateinamen zu bearbeiten
Die Parametererweiterungen im
mv
Befehl funktionieren wie folgt:${f%.*}
- Löschen Sie das kürzeste übereinstimmende Muster vom Ende der darin enthaltenen Zeichenfolge$f
. In diesem Fall löschen Sie alles nach und einschließlich des letzten Punkts. Die Single%
bedeutet "am kürzesten vom Ende".${f##*.}
- Löschen Sie das längste übereinstimmende Muster vom Anfang der darin enthaltenen Zeichenfolge$f
, in diesem Fall alles vor und einschließlich des letzten Punkts (dies schließt auch alle anderen Punkte ein). Das double#
(##
) bedeutet "am längsten von Anfang an".So zum Beispiel, wenn
$f
"Foo.bar.baZ.jpg" enthält:gibt
und
gibt
Der
mv
Befehl würde also nach seiner Erweiterung folgendermaßen aussehen:quelle
f%
undf##
werden hier beschrieben, zum Beispiel: tldp.org/LDP/abs/html/parameter-substitution.htmlUnter Linux gibt es keine Dateinamenerweiterungen.
Verwenden Sie reguläre Ausdrücke, um bestimmte Teilzeichenfolgen aus dem Dateinamen auszuschneiden und darauf zuzugreifen.
Beispiel:
Reales Szenario: Sie extrahieren HTML aus einer CHM-Datei. Bei Dateinamen in Windows wird die Groß- und Kleinschreibung nicht berücksichtigt, sodass unter Linux fehlerhafte Links angezeigt werden. Sie haben eine Datei mit dem Namen index.HTML , aber href = "index.html" in URLs. Ihr Ziel ist es also, Dateinamen so anzupassen, dass sie mit Links verknüpft sind.
Angenommen, Sie haben den Dateinamen in einer Variablen:
Ab Version 3.0 unterstützt bash selbst reguläre Ausdrücke, sodass Sie keine zusätzlichen Tools wie grep / sed / perl usw. benötigen, um Zeichenfolgen zu bearbeiten. Das folgende Beispiel zeigt das Ersetzen einer Back-End-Übereinstimmung in einer Zeichenfolge:
Die Übereinstimmungs- und Ersetzungszeichenfolgen können auf Wunsch parametrisiert werden. Dies bietet zusätzliche Flexibilität beim Schreiben von Skripten. Das folgende Codefragment erreicht das gleiche Ziel:
Weitere Informationen finden Sie in den Bash-Dokumenten.
quelle
Hier ist ein anderes:
quelle
Es gibt immer mehr als einen Weg, dies zu tun. Ich habe das folgende Skript als / usr / local / bin / mrename eingefügt.
Geben Sie dann in das Skript mit den Fotodateien einfach Folgendes ein: mrename
Es gibt auch eine optionale auskommentierte Funktion im Skript zum Skalieren der Fotos (mit ImageMagick).
Hoffe, das ist nützlich für einige Leute.
quelle
Sie können die
-X/--keep-extension
Option mitrename
(Version 1.600) verwenden:-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
ist für Mac von Homebrew und für Linux von Linuxbrew erhältlich (neben anderen Installationsoptionen natürlich).quelle