Unix Bash benennt Dateien mit Regex um

17486
mxg

Ich möchte alle Dateien eines Ordners mit Regex umbenennen (einen Namen am Ende des Namens hinzufügen) und in einen anderen Ordner verschieben.

Meiner Meinung nach sollte es so aussehen:

mv -v ./images/*.png ./test/*test.png, aber es funktioniert nicht.

Kann mir jemand eine Lösung vorschlagen?

4

3 Antworten auf die Frage

7
quack quixote

Es gibt ein praktisches Skript zum Umbenennen von Perl-Dateien, das zusammen mit dem Perl-Hauptpaket auf Debian-basierten Systemen (einschließlich Ubuntu) installiert wird. Es wird normalerweise benannt rename, wird aber manchmal prename(Perl umbenennen) bezeichnet. Verwenden Sie wie folgt:

rename expr file1 file2 file3 

Der Befehl verwendet Perl zur Auswertung exprfür jedes fileArgument und benennt jede Datei in die Ausgabe der exprBewertung um. Für einfache Regex-Ersetzungen wie in Ihrem Beispiel:

rename 's(images/(.*)\.png$)(test/$1.test.png)' ./images/*  # here's the expression: # s()() -- just like s/// (but i don't need to escape the / in the filename) # match regex: images/(.*)\.png$ -- match filenames of the form images/*.png # replace: test/$1.test.png -- turn them into test/*.test.png 

Wenn Dateien nicht mit dem Ausdruck übereinstimmen (z. B. Nicht-PNG-Dateien), führt die Ersetzung keine Änderungen aus und ihre Dateinamen werden nicht geändert.

6
Hal Pomeranz

Ich mag auch den Umbenennungsbefehl, den John T bereitgestellt hat, aber er ist nicht auf allen Systemen verfügbar. Das sollte überall funktionieren:

for i in *.png; do mv -v $i `basename $i .png`.test.png; done 
Folgendes wird zurückgegeben: usage: mv [-f | -i | -n] [-v] Quellziel mv [-f | -i | -n] [-v] Quellverzeichnis ... mxg vor 14 Jahren 0
Für mich gearbeitet: Vielleicht sollten Sie versuchen, Instanzen Ihres $ i zu zitieren: "$ i" Jeremy L vor 14 Jahren 2
Es funktioniert auch für Mac. mxg vor 14 Jahren 0
Dies ist mehr oder weniger die übliche UNIX-Methode, um diese Aufgabe zu erledigen. Sie benötigen lediglich eine Bourne-Shell. Die Perl-Methode ist neu. Cool, aber neugebastelt. pcapademic vor 14 Jahren 0
@EricJLN: Im Vergleich zu UNIX selbst ist es nur "neu" - Perl gibt es jetzt schon seit mehr als zwei Jahrzehnten. (Zum Vergleich: Die Bourne-Shell ist nur ein Jahrzehnt älter; "bash" ist genauso alt wie Perl.) Das Perl-Kochbuch wurde 1998 veröffentlicht und enthält eine einfache Version des gleichen Skripts. es ist sicherlich älter als das. quack quixote vor 14 Jahren 0
2
John T

Sie können renamedie regulären Ausdrücke oder diese grundlegende 3-Argument-Syntax verwenden:

Umbenennen von .png .test.png * .png
  • Das erste Argument ist, was im Dateinamen ersetzt werden soll
  • Das zweite Argument lautet, durch was zu ersetzen ist
  • Das dritte Argument ist, welche Dateien für den Vorgang in diesem Fall für alle Dateien verwendet werden sollen.
ist das das gleiche wie die von mir beschriebene perl-umbenennung oder etwas anderes? Ich bin nicht mit der von Ihnen beschriebenen Syntax vertraut. quack quixote vor 14 Jahren 0
Ich glaube nicht Dies ist eine binäre. Siehe hier: http://linux.die.net/man/1/rename und hier: http://pastebin.ca/1726871. John T vor 14 Jahren 0
thx, das ist interessant. Möglicherweise wird die erwähnte Umbenennung unter `/ usr / bin / prename` installiert und dann mit` / usr / bin / rename` verknüpft. quack quixote vor 14 Jahren 0