Beachten Sie, dass Sie das von Debian und Derivaten (Ubuntu, Mint,…) verteilte Perl-Skript verwendenrename
. Andere Linux-Distributionen liefern einen völlig anderen und wesentlich weniger nützlichen Befehl namens rename
.
y/A-Z/a-z/
übersetzt jedes Zeichen im Bereich A
durch Z
in das entsprechende Zeichen im Bereich a
durch z
, dh ASCII-Großbuchstaben in den entsprechenden Kleinbuchstaben. Verwenden Sie, um die entgegengesetzte Übersetzung durchzuführen y/a-z/A-Z/
. Eine andere Möglichkeit, denselben Befehl zu schreiben, ist rename '$_ = uc($_)' *
- uc
die Funktion u pper c ase, und der rename
Befehl benennt Dateien basierend auf der in die $_
Variable vorgenommenen Umwandlung um .
rename '…' *
benennt nur Dateien im aktuellen Verzeichnis um, da dies *
übereinstimmt. Punktedateien (Dateien, deren Name mit beginnt .
) werden ebenfalls übersprungen.
Wenn Sie Dateien im aktuellen Verzeichnis und in Unterverzeichnissen rekursiv umbenennen möchten, können Sie mit dem find
Befehl das aktuelle Verzeichnis rekursiv durchlaufen. Hier gibt es eine Schwierigkeit: Wenn Sie aufrufen rename
, werden sowohl das Verzeichnis als auch der Basisname umbenannt. Wenn Sie rename
ein Verzeichnis aufrufen, bevor Sie es erneut verwenden ( find -exec rename … {} \;
), find
wird dies verwirrt, da ein Verzeichnis gefunden wurde, dieses Verzeichnis jedoch nicht mehr vorhanden ist, wenn versucht wird, in dieses Verzeichnis abzusteigen. Sie können dies umgehen find
, indem Sie anweisen , ein Verzeichnis zu durchlaufen, bevor Sie darauf reagieren. Am Ende versuchen Sie jedoch, es umzubenennen foo/bar
, FOO/BAR
aber das Verzeichnis FOO
existiert nicht.
Eine einfache Möglichkeit, diese Schwierigkeit zu vermeiden, besteht darin, den Umbenennungsbefehl nur auf den Basisnamen des Pfads anzuwenden. Der reguläre Ausdruck ([^/]*\Z)
entspricht dem letzten Teil des Pfads, der kein a enthält /
.
find . -depth -exec rename 's!([^/]*\Z)!uc($1)!e' {} +
Die Shell zsh bietet bequemere Funktionen zum Umbenennen - noch kryptischer als Perl, aber knapper und oft einfacher zu komponieren.
Die Funktion zmv
benennt Dateien basierend auf Mustern um. Führen Sie es autoload -U zmv
einmal aus, um es zu aktivieren (setzen Sie diese Zeile in Ihre .zshrc
).
Im ersten Argument zu zmv
(dem zu ersetzenden Muster) können Sie die leistungsstarken Platzhaltermuster von zsh verwenden . Im zweiten Argument zu zmv
(dem Ersatztext) können Sie die Parametererweiterungsfunktionen einschließlich der Verlaufsmodifikatoren verwenden .
zmv -w '**/*' '$1$2:u'
Erläuterung:
-w
- Automatische Zuweisung numerischer Variablen zu jedem Platzhaltermuster
**/*
- Alle Dateien in Unterverzeichnissen rekursiv ( **/
entspricht 0, 1 oder mehr Ebenen von Unterverzeichnissen)
$1
- die erste numerische Variable, die hier mit dem Verzeichnisteil jedes Pfads übereinstimmt
$2:u
- die zweite numerische Variable, die hier mit dem :u
Basisnamen jedes Pfads übereinstimmt, mit dem Modifikator, um den Wert in Großbuchstaben umzuwandeln
Als zusätzlichen Bonus werden die Einstellungen für das Gebietsschema der Umgebung berücksichtigt.
Wenn Sie sich bei einem von zmv
Ihnen geschriebenen Befehl nicht sicher sind , können Sie die -n
Option übergeben, um zu drucken, was der Befehl tun würde, und nichts ändern. Überprüfen Sie die Ausgabe, und führen Sie den Befehl erneut aus, wenn er das tut, was Sie möchten, ohne -n
tatsächlich zu handeln.
rename 'y/a-z/A-Z/' *
Sie das bekommen, was Sie wollen , wenn Sie es versuchen . Seien Sie vorsichtig, wo Sie es testen.