So verwenden Sie den Umbenennungsbefehl unter Linux

Lernen Sie die mächtigen Werkzeuge zur Dateiumbenennung in der Linux-Welt kennen und gönnen Sie dem Befehl mv – und sich selbst – eine Pause. Das Umbenennen von Dateien kann flexibel, schnell und manchmal sogar einfacher sein. Hier ist eine Anleitung zu diesem leistungsstarken Befehl.

Was ist das Problem mit mv?

Es gibt nichts, was gegen den Befehl mv spricht. Er erledigt seine Aufgabe gut und ist auf allen Linux-Distributionen, macOS und anderen Unix-ähnlichen Betriebssystemen verfügbar. Er ist also immer einsatzbereit. Manchmal braucht man jedoch einen Bulldozer und keinen Spaten.

Der Befehl mv ist dazu da, Dateien zu verschieben. Ein angenehmer Nebeneffekt ist, dass er eine vorhandene Datei in eine neue Datei mit einem neuen Namen verschieben kann. Im Endeffekt wird die Datei umbenannt, was uns hilft, das zu erreichen, was wir wollen. Aber mv ist kein spezielles Werkzeug zum Umbenennen von Dateien.

Umbenennen einer einzelnen Datei mit mv

Um mv zum Umbenennen einer Datei zu verwenden, geben Sie mv gefolgt von einem Leerzeichen, dem Namen der Datei, einem weiteren Leerzeichen und dem neuen Namen ein, den die Datei haben soll. Drücken Sie dann die Eingabetaste.

Sie können mit dem Befehl ls überprüfen, ob die Datei umbenannt wurde.

mv alte_datei.txt neue_datei.txt
ls *.txt

Umbenennen mehrerer Dateien mit mv

Schwieriger wird es, wenn Sie mehrere Dateien umbenennen möchten. mv ist nicht dafür gedacht, mehrere Dateien gleichzeitig umzubenennen. Sie müssen auf einige clevere Bash-Tricks zurückgreifen. Das ist in Ordnung, wenn Sie ein paar Befehlszeilen-Kniffe kennen, aber die Komplexität des Umbenennens mehrerer Dateien mit mv steht in starkem Kontrast zur einfachen Verwendung von mv zum Umbenennen einer einzelnen Datei.

Die Sache wird schnell komplizierter.

Nehmen wir an, wir haben ein Verzeichnis mit verschiedenen Dateitypen. Einige dieser Dateien haben die Erweiterung „.prog“. Wir möchten sie in der Befehlszeile umbenennen, sodass sie die Erweiterung „.prg“ haben.

Wie bringen wir mv dazu, das für uns zu tun? Werfen wir einen Blick auf die Dateien.

ls *.prog -l

Hier ist eine Möglichkeit, dies zu tun, ohne eine tatsächliche Bash-Skriptdatei zu schreiben.

for f in *.prog; do mv -- "$f" "${f%.prog}.prg"; done

Hat es funktioniert? Lassen Sie uns die Dateien überprüfen.

ls *.pr*

Ja, es hat funktioniert. Sie sind jetzt alle „.prg“-Dateien, und das Verzeichnis enthält keine „.prog“-Dateien mehr.

Was ist gerade passiert?

Was hat dieser lange Befehl eigentlich bewirkt? Betrachten wir ihn im Detail:

for f in *.prog; do mv -- "$f" "${f%.prog}.prg"; done

Der erste Teil startet eine Schleife, die jede „.prog“-Datei im Verzeichnis nacheinander verarbeitet.

Der nächste Teil definiert, was bei jeder Verarbeitung geschehen soll. Er verwendet mv, um jede Datei in eine neue Datei zu verschieben. Die neue Datei erhält den Namen der ursprünglichen Datei, jedoch ohne den Teil „.prog“. Stattdessen wird die neue Erweiterung „.prg“ verwendet.

Es muss einen einfacheren Weg geben

Ja, den gibt es. Es ist der Befehl rename.

rename ist nicht Teil jeder Standard-Linux-Distribution, daher müssen Sie es installieren. Er hat auch unterschiedliche Namen in verschiedenen Linux-Familien, aber sie funktionieren alle auf die gleiche Weise. Sie müssen lediglich den entsprechenden Befehlsnamen für Ihre Linux-Variante verwenden.

In Distributionen, die von Ubuntu und Debian abgeleitet sind, installieren Sie rename wie folgt:

sudo apt-get install rename

In von Fedora und RedHat abgeleiteten Distributionen installieren Sie prename wie folgt. Beachten Sie das anfängliche „p“, das für Perl steht.

sudo dnf install prename

Um es in Manjaro Linux zu installieren, verwenden Sie den folgenden Befehl. Beachten Sie, dass der Umbenennungsbefehl perl-rename heißt.

sudo pacman -Syu perl-rename

Lassen Sie uns das nochmal versuchen

Und dieses Mal verwenden wir rename. Wir drehen die Uhr zurück, sodass wir eine Reihe von „.prog“-Dateien haben.

ls *.prog

Lassen Sie uns nun den folgenden Befehl verwenden, um sie umzubenennen. Wir überprüfen dann mit ls, ob es funktioniert hat. Denken Sie daran, rename durch den entsprechenden Befehlsnamen für Ihr Linux zu ersetzen, wenn Sie kein Ubuntu oder ein von Debian abgeleitetes Linux verwenden.

rename 's/\.prog/\.prg/' *.prog
ls *.pr*

Das hat funktioniert. Sie sind jetzt alle „.prg“-Dateien, und es befinden sich keine „.prog“-Dateien mehr im Verzeichnis.

Was ist dieses Mal passiert?

Lassen Sie uns diesen Vorgang in drei Teile aufschlüsseln:

Der erste Teil ist der Befehlsname: rename (oder prename oder perl-rename, je nach Distribution).

Der letzte Teil ist *.prog, was rename anweist, mit allen „.prog“-Dateien zu arbeiten.

Der mittlere Teil definiert die Arbeit, die wir an jedem Dateinamen ausführen möchten. Das s steht für Ersetzen. Der erste Term (.prog) ist das, wonach rename in jedem Dateinamen sucht, und der zweite Term (.prg) ersetzt ihn.

Der mittlere Teil des Befehls, der zentrale Ausdruck, ist ein Perl-Ausdruck für reguläre Ausdrücke, der dem Befehl rename seine Flexibilität verleiht.

Andere Teile eines Dateinamens ändern

Wir haben bisher die Dateinamenerweiterungen geändert, jetzt ändern wir andere Teile der Dateinamen.

Im Verzeichnis befinden sich viele C-Quellcodedateien. Alle Dateinamen beginnen mit „slang_“. Wir können dies mit dem Befehl ls überprüfen.

ls sl*.c

Wir werden alle Vorkommen von „slang_“ durch „sl_“ ersetzen. Das Format des Befehls ist uns bereits bekannt. Wir ändern nur den Suchbegriff, den Ersetzungsbegriff und den Dateityp.

rename 's/slang_/sl_/' *.c

Dieses Mal suchen wir nach „.c“-Dateien und nach „slang_“. Immer wenn „slang_“ in einem Dateinamen gefunden wird, wird es durch „sl_“ ersetzt.

Wir können das Ergebnis dieses Befehls überprüfen, indem wir den Befehl ls von oben mit den gleichen Parametern wiederholen:

ls sl*.c

Einen Teil eines Dateinamens löschen

Wir können einen Teil eines Dateinamens entfernen, indem wir den Suchbegriff durch nichts ersetzen.

ls *.c
rename 's/sl_//' *.c
ls *.c

Wir sehen am ls-Befehl, dass unsere „.c“-Dateien alle mit „sl_“ beginnen. Lassen Sie uns dies loswerden.

Der Befehl rename folgt dem gleichen Format wie zuvor. Wir suchen nach „.c“-Dateien. Der Suchbegriff ist „sl_“, aber es gibt keinen Ersatzbegriff. Zwei Schrägstriche ohne etwas dazwischen bedeuten nichts, eine leere Zeichenfolge.

rename verarbeitet jede „.c“-Datei nacheinander. Es sucht im Dateinamen nach „sl_“. Wenn es gefunden wird, wird es durch nichts ersetzt. Mit anderen Worten: der Suchbegriff wird gelöscht.

Der zweite Aufruf von ls bestätigt, dass das Präfix „sl_“ aus jeder „.c“-Datei entfernt wurde.

Änderungen auf bestimmte Teile von Dateinamen beschränken

Lassen Sie uns ls verwenden, um Dateien anzusehen, deren Dateiname die Zeichenfolge „param“ enthält. Dann verwenden wir rename, um diese Zeichenfolge durch „parameter“ zu ersetzen. Wir verwenden ls noch einmal, um zu sehen, wie sich der Befehl rename auf diese Dateien ausgewirkt hat.

ls *param*
rename 's/param/parameter/' *.c
ls *param*

Es wurden vier Dateien gefunden, deren Dateinamen „param“ enthalten. param.c, param_one.c und param_two.c haben alle „param“ am Anfang des Namens. third_param.c hat „param“ am Ende des Namens, direkt vor der Erweiterung.

Der Befehl rename sucht überall im Dateinamen nach „param“ und ersetzt es in allen Fällen durch „parameter“.

Die zweite Verwendung von ls zeigt uns, dass genau das passiert ist. Unabhängig davon, ob „param“ am Anfang oder am Ende des Dateinamens stand, wurde es durch „parameter“ ersetzt.

Wir können die Metazeichen von Perl verwenden, um das Verhalten des mittleren Ausdrucks genauer zu steuern. Metazeichen sind Symbole, die Positionen oder Zeichenfolgen darstellen. ^ bedeutet beispielsweise „Anfang einer Zeichenfolge“, $ bedeutet „Ende einer Zeichenfolge“ und . bedeutet jedes einzelne Zeichen (außer einem Zeilenumbruch).

Wir verwenden das Metazeichen für den Anfang des Strings (^), um unsere Suche auf den Anfang der Dateinamen zu beschränken.

ls *param*.c
rename 's/^parameter/value/' *.c
ls *param*.c
ls value*.c

Die zuvor umbenannten Dateien werden angezeigt, und wir sehen, dass die Zeichenfolge „parameter“ am Anfang von drei Dateinamen und am Ende eines Dateinamens steht.

Unser Befehl rename verwendet das Metazeichen für den Zeilenanfang (^) vor dem Suchbegriff „parameter“. Dies weist rename an, den Suchbegriff nur dann als gefunden zu betrachten, wenn er am Anfang des Dateinamens steht. Die Suchzeichenfolge „parameter“ wird ignoriert, wenn sie sich an anderer Stelle im Dateinamen befindet.

Wenn wir mit ls überprüfen, sehen wir, dass der Dateiname mit „parameter“ am Ende des Dateinamens nicht geändert wurde. Bei den drei Dateinamen mit „parameter“ am Anfang des Namens wurde der Suchbegriff durch den Ersatzbegriff „value“ ersetzt.

Die Leistungsfähigkeit von rename liegt in der Leistungsfähigkeit von Perl. Die ganze Leistung von Perl steht Ihnen zur Verfügung.

Suchen mit Gruppierungen

rename hat noch mehr Tricks auf Lager. Betrachten wir den Fall, in dem Sie Dateien mit ähnlichen Zeichenfolgen in ihren Namen haben. Es sind nicht genau dieselben Zeichenfolgen, daher funktioniert eine einfache Suche und Ersetzung hier nicht.

In diesem Beispiel verwenden wir ls, um zu überprüfen, welche Dateien wir haben, die mit „str“ beginnen. Es gibt zwei davon: string.c und strangle.c. Wir können beide Zeichenfolgen gleichzeitig umbenennen, indem wir eine Technik namens Gruppierung verwenden.

Der zentrale Ausdruck dieses rename-Befehls sucht nach Zeichenfolgen in Dateinamen, die die Zeichenfolge „stri“ oder „stra“ enthalten, wobei diesen Folgen direkt „ng“ folgt. Mit anderen Worten, unser Suchbegriff sucht nach „string“ und „strang“. Der Ersetzungsbegriff ist „bang“.

ls str*.c
rename 's/(stri|stra)ng/bang/' *.c
ls ban*.c

Wenn Sie ls ein zweites Mal verwenden, wird bestätigt, dass string.c zu bang.c und strangle.c zu bangle.c wurde.

Verwendung von Übersetzungen mit rename

Der Befehl rename kann Aktionen für Dateinamen ausführen, die als Übersetzungen bezeichnet werden. Ein einfaches Beispiel für eine Übersetzung wäre, eine Reihe von Dateinamen in Großbuchstaben zu erzwingen.

Beachten Sie im folgenden rename-Befehl, dass wir nicht s/ verwenden, um den zentralen Ausdruck zu starten, sondern y/. Dies teilt rename mit, dass wir keine Ersetzung vornehmen, sondern eine Übersetzung.

Der Begriff az ist ein Perl-Ausdruck, der alle Kleinbuchstaben in der Reihenfolge von a bis z bedeutet. Ebenso repräsentiert der Begriff AZ alle Großbuchstaben in der Reihenfolge von A bis Z.

Der zentrale Ausdruck in diesem Befehl kann wie folgt interpretiert werden: „Wenn einer der Kleinbuchstaben von a bis z im Dateinamen gefunden wird, ersetzen Sie ihn durch die entsprechenden Zeichen aus der Folge der Großbuchstaben von A bis Z.“

Um die Dateinamen aller „.prg“-Dateien in Großbuchstaben zu erzwingen, verwenden Sie diesen Befehl:

rename 'y/az/AZ/' *.prg

ls *.PRG

Der Befehl ls zeigt uns, dass alle „.prg“-Dateinamen jetzt in Großbuchstaben sind. Genauer gesagt handelt es sich nicht mehr um „.prg“-Dateien. Es sind „.PRG“-Dateien. Linux unterscheidet zwischen Groß- und Kleinschreibung.

Wir können diesen letzten Befehl umkehren, indem wir die Positionen der Begriffe az und AZ im zentralen Ausdruck umkehren.

rename 'y/AZ/az/' *.PRG

ls *.prg

Man lernt Perl nicht in fünf Minuten

Die Auseinandersetzung mit Perl ist eine gut investierte Zeit. Sie müssen jedoch keine tiefgreifenden Perl-Kenntnisse haben, um die zeitsparenden Fähigkeiten des Befehls rename in Bezug auf Leistung, Einfachheit und Zeit zu nutzen.