Mehrere Ausdrücke im Befehlszeilendienstprogramm "rename"

621
Dmitry Kabanov

Ich lerne, wie Sie das Befehlszeilen-Unix-Dienstprogramm verwenden rename(siehe beispielsweise https://www.tecmint.com/rename-multiple-files-in-linux/ ).

Das Handbuch renamesagt aus, dass Sie mehrere Umbenennungsregeln kombinieren können (Beachten Sie, es ist eine Zusammenfassung der Verwendung, bei der ich andere Argumente zur besseren Übersicht entferne):

rename [ -e|-E perlexpr]*|perlexpr [ files ] 

Ich versuche dies an dem folgenden Beispiel. Ich habe ein Verzeichnis mit Dateien:

$ ls 01.php 02.php 03.php 

Ich renamewende zwei Transformationen mit einer Aufforderung an:

rename -n -v -e "s/\.php$/\.htm/" "y/a-z/A-Z/" * 

Das erwartete Verhalten ist, dass ich Folgendes habe:

$ ls 01.HTM 02.HTM 03.HTM 

Die Ausgabe von renameist jedoch

rename(01.php, 01.htm) rename(02.php, 02.htm) rename(03.php, 03.htm) 

Das heißt, die zweite Umwandlung (Kleinbuchstaben in Großbuchstaben) wird nicht angewendet.

Wie kombiniere ich mehrere Ausdrücke?

0
_Soll_ Arbeit ist es, vor jeder Ersetzung "-e" zu setzen, dh "-n -v -e" s / \. Php $ / \. Htm / "-e" y / az / AZ / "*", aber Dies gibt einen Fehler. Die Dokumentation ("Man Rename") ist verwirrend, was bedeutet, dass Sie "-E" benötigen, um das Semikolon-Trennzeichen zu verwenden. Die Antwort von Toto funktioniert jedoch ebenso wie "Rename -n -v -E" s / \. Php $ / \. htm / "-E" y / az / AZ / "*` und `umbenennen -n -v -e" s / \. php $ / \. htm /; " -e "y / az / AZ /" * `sowie die schrullige Umbenennung -n -v -e" s / \. php $ / \. htm / "-e"; " -e "y / az / AZ /" * `. Ich bin zu dem Schluss gekommen, dass "-E" ein implizites Semikolon zwischen Ausdrücken hinzufügt, während "-e" explizite Semikolons erfordert. AFH vor 5 Jahren 1
@AFH, vielen Dank für nützliche Vorschläge! Dmitry Kabanov vor 5 Jahren 0

1 Antwort auf die Frage

2
Toto

Um mehrere Ausdrücke zu kombinieren, trennen Sie die Ausdrücke mit einem Semikolon (Anweisungstrennzeichen in Perl):

rename -n -v -e "s/\.php$/\.htm/; y/a-z/A-Z/" * 

Zusätzliche Varianten basierend auf den Kommentaren von @AFH

Eine andere Möglichkeit (keine Notwendigkeit -e, alle Ausdrücke mit zu kombinieren ;):

rename -n -v "s/\.php$/\.htm/; y/a-z/A-Z/" * 

Noch eine andere Möglichkeit (jeden Ausdruck voranstellen -e; ;am Ende des ersten Ausdrucks beachten ):

rename -n -v -e "s/\.php$/\.htm/;" -e "y/a-z/A-Z/" * 

Noch eine Möglichkeit (jeden Ausdruck voranstellen -E, der ;implizit hinzufügt ):

rename -n -v -E "s/\.php$/\.htm/" -E "y/a-z/A-Z/" * 
Ich habe Ihre Antwort basierend auf dem Kommentar von @AFH erweitert und akzeptiert. Vielen Dank! Dmitry Kabanov vor 5 Jahren 0