Batch-Umbenennungsdateien unter Linux

7

Wie kann ich Bilder mit dem Befehl 'Umbenennen' von "Something_full.jpg" in "Something_500.jpg" rekursiv umbenennen?

Ticksy
quelle

Antworten:

6

Grundsätzlich können Sie das renameTool dafür verwenden. Es sollte in einer Perl-basierten Version mit Debian-basierten Linux-Distributionen vorliegen, aber Sie können es auch einfach von der Quelle herunterladen (natürlich müssen Sie es zuerst mit ausführbar machen chmod +x).


Der folgende Befehl ersetzt das _fullTeil durch _500alle JPG-Dateien im aktuellen Verzeichnis.

rename 's/_full/_500/' *.jpg

Verwenden Sie dazu rekursiv ausgehend von Ihrem aktuellen Verzeichnis renamemit find.

find . -type f -iname "*.jpg" -exec rename 's/_full/_500/' {} \;

Hinweis: Möglicherweise möchten Sie den Befehl testen, bevor er tatsächlich ausgeführt wird. Fügen Sie dazu die -nOption hinzu rename(z. B. zwischen renameund der 's//'Zeichenfolge).

slhck
quelle
mein schlechtes, ich habe Larry dort unterschätzt! Wie wäre es mit dem Weiterleiten der JPG-Dateipfade anstelle von exec?
Nik
Vielen Dank. Ich habe erfolgreich verwendet find . -type f -iname "*.jpg" -exec rename 's/_full/_500/' {} \;.
Ticksy
@nik Warum sollten Sie die von angebotenen Sicherheit findgegen etwas austauschen , das Rohrleitungskonstrukte umfasst (und möglicherweise aufgrund von Leerzeichen in Dateinamen usw. fehlschlägt)? Ich habe festgestellt, dass Letzteres unsicher und bestenfalls schwer zu lesen ist.
Slhck
1

Vielleicht möchten Sie in zmv schauen . zmv ist eine zsh-spezifische Funktion und muss autoload -U zmvsich irgendwo in Ihrer .zshrcDatei befinden.

EDIT: Als Beispiel könnte die Aufgabe, die das OP stellte, gelöst werden

noglob zmv '(*)_full.(*)' '$1_500.$2'

Ein Auszug aus der zshcontribManpage:

zmv [ -finqQsvwW ] [ -C | -L | -M | -p program ] [ -o optstring ] srcpat dest

Verschieben Sie (normalerweise umbenennen) Dateien, die dem Muster srcpat entsprechen, in entsprechende Dateien mit Namen der von dest angegebenen Form, wobei srcpat Klammern um Muster enthält, die wiederum durch $ 1, $ 2, ... in dest ersetzt werden. Zum Beispiel,

zmv '(*).lis' '$1.txt'

benennt um foo.lisin foo.txt, my.old.stuff.lisum my.old.stuff.txtund so weiter.

Das Muster wird immer als EXTENDED_GLOB-Muster behandelt. Jede Datei, deren Name durch die Ersetzung nicht geändert wird, wird einfach ignoriert. Jeder Fehler (eine Ersetzung führte zu einer leeren Zeichenfolge, zwei Ersetzungen ergaben das gleiche Ergebnis, das Ziel war eine vorhandene reguläre Datei und -f wurde nicht angegeben) führt dazu, dass die gesamte Funktion abgebrochen wird, ohne etwas zu tun.

EXTENDED_GLOB-Muster sind enorm leistungsfähig. Hier ist eine gute Einführung in das Konzept.

mkaito
quelle
Ich habe ein Beispiel und eine Dokumentation hinzugefügt.
Mkaito