Rename: Unterschied zwischen den Versionen

Aus Foxwiki
Keine Bearbeitungszusammenfassung
K Textersetzung - „== Syntax ==“ durch „== Aufruf ==“
 
(51 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt)
Zeile 1: Zeile 1:
{{DISPLAYTITLE:rename}}
'''rename''' - (file-rename) Dateien nach Regeln umbenennen


'''topic''' - Kurzbeschreibung
== Beschreibung ==
== Beschreibung ==
== Installation ==
''file-rename'' benennt Dateinamen gemäß angegebener Regel um
=== Fehlerbehebung ===
 
== Syntax ==
=== Optionen ===
=== Parameter ===
=== Umgebungsvariablen ===
=== Exit-Status ===
== Anwendungen ==
== Anwendungen ==
== Konfiguration ==
<syntaxhighlight lang="bash" line>
=== Dateien ===
rename DSC 2002_10_14- *.jpg
== Sicherheit ==
rename "s/^DSC/2002_10_14-/" *.jpg
</syntaxhighlight>
 
# Beide Zeilen erledigen die gleiche Aufgabe
# Die zweiter Version bietet die volle Mächtigkeit von Regulären Ausdrücken
 
Das Umbenennen einer einzelnen Datei ist keine große Herausforderung
* Doch wie ist vorzugehen, wenn man Hunderte oder Tausende von Dateien – z.&nbsp;B.&nbsp; Fotos aus einer Digitalkamera oder die eigene Musiksammlung – in einem einzelnen Ordner oder in vielen Unterordnern umbenennen muss?
* Im grafischen Dateimanager alles markieren und umbenennen funktioniert nicht und jede Datei einzeln umbenennen, dauert viel zu lange
 
; Reguläre Ausdrücke
Unter Linux hilft hier „rename“ in Kombination mit den sogenannten „perl regular expressions“ weiter.
* „Reguläre Ausdrücke“ sind eine Art „Zwischenabfrage“, welche den Dateinamen vor dem eigentlichen Umbenennen durch „rename“ analysieren
 
; Aktionen
* Für die meisten Aktionen reicht der Zusatz 's/suchbegriff/ersetzung/g' mitzugeben, wobei s für „single line“ (Ausdruck muss auf einer Zeile stehen) und g für „global“ (ersetzen, sooft der Ausdruck gefunden wird) steht
* Soll ohne Unterscheidung von Gross- und Kleinschreibung gesucht werden, dann kann Am Ende noch ein i für insensitive (egal, ob groß oder kleingeschrieben) mitgegeben werden
 
=== Teile aus dem Dateinamen entfernen ===
Es gibt viele Situationen, in denen man Teile des Dateinamens entfernt haben möchte
* Bei Musiktiteln will man den Namen des Albums beziehungsweise des Interpreten loswerden, bei Bildern doppelt vorhandene Endungen oder überhaupt zuviele Leerzeichen und Bindestriche
 
<syntaxhighlight lang="bash" line>
rename 's/Amelie//g' *
rename 's/Amelie \(Soundtrack\) - //g' *
rename 's/ -//g' *
</syntaxhighlight>
 
# Das erste Beispiel entfernt das Wort „Amelie“, das zweite Beispiel die gesamte Zeichenfolge „Amelie \(Soundtrack\) - “ aus dem Namen aller Dateien im aktuellen Verzeichnis
# Beachten, dass allfällige Sonderzeichen im Suchbegriff – in diesem Fall die runden Klammern – immer mit einem Backslash gekennzeichnet werden müssen
# Das letzte Beispiel zeigt, dass man auch mehrere Leerzeichen problemlos aus dem Dateinamen entfernen kann
 
=== Teile innerhalb des Dateinamens ersetzen ===
Neben dem Entfernen ungewollter Teile aus dem Dateinamen besteht oftmals auch die Notwendigkeit, einzelne Wörter, Buchstaben oder Zeichen zu ersetzen
* wie bereits vorhin erwähnt, muss hier ein besonderes Augenmerk auf das „Escapen“ der Sonderzeichen gelegt werden
 
<syntaxhighlight lang="bash" line>
rename 's/ /_/g' * oder rename 's/\s+/_/g' *
rename 's/-/./g' *
rename 's/\'/’/g' *
rename 's/^/Amélie_Soundtrack_/' *.ogg
rename 's/ogg$/ogn/' *.ogg
</syntaxhighlight>


== Siehe auch ==
# Das erste Beispiel ersetzt alle Leerzeichen durch Unterstriche
=== Dokumentation ===
# das zweite alle Bindestriche durch Punkte
==== RFC ====
# das dritte alle falschen Apostrophe durch typografisch richtige im Namen aller Dateien im aktuellen Verzeichnis
==== Man-Pages ====
# Die beiden letzten Beispiele benutzen die Sonderzeichen ^ (= Anfang der Zeile) und $ (= Ende der Zeile), um das Ersetzen auf einen bestimmten Bereich des Dateinamens einzugrenzen; daher kann auch das g für global wegfallen
==== Info-Pages ====
=== Links ===
==== Einzelnachweise ====
<references />
==== Projekt ====
==== Weblinks ====


== Testfragen ==
Um zu Testen, wie wichtig das „Escapen“ der Sonderzeichen ist, versuchen sie einmal die beiden Befehle „rename 's/ /./g' *“ und „rename 's/./ /g' *“ hintereinander
<div class="toccolours mw-collapsible mw-collapsed">
* Dummerweise steht der Punkt in den Regular Expressions für "irgendein Zeichen", d.&nbsp;h.&nbsp;der letzte Befehl ersetzt jedes Zeichen im Dateinamen durch ein Leerzeichen!
''Testfrage 1''
* Der korrekte zweite Befehl muss daher „rename 's/\./ /g' *“ lauten – und zum Retten der Dateiendung anschließend noch „rename 's/ ogg$/.ogg/g' *“
<div class="mw-collapsible-content">'''Antwort1'''</div>
</div>
<div class="toccolours mw-collapsible mw-collapsed">
''Testfrage 2''
<div class="mw-collapsible-content">'''Antwort2'''</div>
</div>
<div class="toccolours mw-collapsible mw-collapsed">
''Testfrage 3''
<div class="mw-collapsible-content">'''Antwort3'''</div>
</div>
<div class="toccolours mw-collapsible mw-collapsed">
''Testfrage 4''
<div class="mw-collapsible-content">'''Antwort4'''</div>
</div>
<div class="toccolours mw-collapsible mw-collapsed">
''Testfrage 5''
<div class="mw-collapsible-content">'''Antwort5'''</div>
</div>


= TMP =
=== Gross- und Kleinschreibung des Dateinamens manipulieren ===
== rename ==
* Die Gross- und Kleinschreibung eines Dateinamens lässt sich ebenfalls sehr einfach mit einem „Einzeiler“ ändern, wobei dies den gesamten Dateinamen, aber auch nur Teile davon betreffen kann
* Je nachdem welche Programmversion von rename zur Verfügung steht kann der Syntax so:


rename DSC 2002_10_14- *.jpg
<syntaxhighlight lang="bash" line>
rename 'y/[A-Z]/[a-z]/' *
rename 's/\.JPG/\.jpg/g' *.JPG
rename 's/^\w/\U$&/g' *
</syntaxhighlight>


* oder auch so aussehen:
# Das erste Beispiel ersetzt alle großgeschriebenen Buchstaben durch kleingeschriebene
#: Da hier nicht nach einem einzelnen zusammenhängenden Begriff gesucht, sondern ein ganzer Buchstabenbereich analysiert wird und einzelne Zeichen mit einem korrespondierenden Zeichen (eben ein A durch ein a und ein Z durch ein z) ersetzt werden, muss anstelle des s ein y (transliteration) gesetzt werden
# Das zweite Beispiel hingegen ersetzt wiederum nur einen einzigen Begriff, nämlich das gross geschriebene „.JPG“ durch ein klein geschriebenes „.jpg“, daher die bekannte Kombination „'s/ / /g'“
# Das letzte Beispiel sieht ein wenig komplex aus, ist aber leicht erklärt: es wir nach dem Wort (\w) am Anfang (^) der Zeile (/s) gesucht, dann aber nur der erste Buchstabe ($&) grossgeschrieben (\U)


rename "s/^DSC/2002_10_14-/" *.jpg
=== Dateinamen umbauen und ergänzen ===
; Teile des Dateinamens umbauen und ergänzen
Insbesondere bei größeren digitalen Bildersammlungen möchte man gerne die nichtssagenden Zahlen im Namen, welche von der Digitalkamera generiert werden, durch aussagekräftige Dateinamen ersetzten
* Auch dies ist mit „rename“ problemlos möglich


* Beide Zeilen erledigen den gleichen Job. Die zweiter Version bietet die volle Mächtigkeit von Regulären Ausdrücken.
<syntaxhighlight lang="bash" line>
rename 's/(\d{8})\.JPG$/Türkeiferien_$1\.jpg/' *.JPG
rename 's/\d{5}(\d{3})\.JPG$/Türkeiferien_$1\.jpg/' *.JPG
</syntaxhighlight>


* Das Umbenennen einer einzelnen Datei ist keine grosse Herausforderung. Doch wie ist vorzugehen, wenn man Hunderte oder Tausende von Dateien – z. B. Fotos aus einer Digitalkamera oder die eigene Musiksammlung in einem einzelnen Ordner oder in vielen Unterordnern umbennen muss? Im grafischen Dateimanager alles markieren und umbenennen funktioniert nicht und jede Datei einzeln umbenennen, dauert viel zu lange.
# Obiges Beispiel nimmt die ersten acht Zahlen (\d{8}) des Dateinamens aller auf JPG-Dateien (\.JPG) und speichert diese für die spätere Weiterverwendung (daher die runden Klammern um \d{8} herum)
#* Der neue Dateiname besteht aus der Bezeichnung „Türkeiferien_“ und der vorhin gespeicherten acht Zahlen, die mittels der Variablen $1 angehängt werden; zudem wird die Dateiendung noch in Kleinbuchstaben (\.jpg)umgewandelt
# Das zweite Beispiel ist sogar noch ein wenig ausgefeilter, denn es speichert nur die letzten drei Zahlen ((\d{3})) des alten achtzahligen Dateinamens, um sie nachher an die Bezeichnung „Türkeiferien_“ anzufügen
#* Neben dem regulären Ausdruck für „irgendeine Zahl, aber kein Buchstabe“ (\d) gibt es natürlich auch noch denjenigen für „irgendeinen Buchstaben, aber keine Zahl“ (\w) oder deren Umkehrung „alles, nur keine Zahl“ (\D) und „alles, nur keinen Buchstaben“ (\W)
#* Leerzeichen können entweder als solche gesetzt werden (siehe erste Beispiele weiter oben) oder aber mit dem regulären Ausdruck \s – oder natürlich auch mit dessen Umkehr \S („alles, außer Leerzeichen“) – aufgespürt werden


* Unter Linux hilft hier „rename“ in Kombination mit den sogenannten „perl regular expressions“ weiter. „Reguläre Ausdrücke“ sind eine Art „Zwischenabfrage“, welche den Dateinamen vor dem eigentlichen Umbenennen durch „rename“ analysieren.  
=== Dateinamen kürzen ===
<syntaxhighlight lang="bash" line>
rename -n 's/(.{100}).*(\.pdf)/$1$2/xms' *.pdf
</syntaxhighlight>


* Für die meisten Aktionen reicht der Zusatz 's/suchbegriff/ersetzung/g' mitzugeben, wobei s für „single line“ (Ausdruck muss auf einer Zeile stehen) und g für „global“ (ersetzen, sooft der Ausdruck gefunden wird) steht.
; Unterverzeichnisse
ersetze das *.pdf durch ein **/*.pdf
<syntaxhighlight lang="bash" line>
find -name '*.pdf' -exec rename -n 's/(.{100}).*(\.pdf)/$1$2/xms' {} +
</syntaxhighlight>
Das -n gibt erst mal nur die Änderungen aus


* Soll ohne Unterscheidung von Gross- und Kleinschreibung gesucht werden, dann kann Am Ende noch ein i für insensitive (egal, ob gross oder klein geschrieben) mitgegeben werden.
; Alle Dateitypen, gesamtes Dateisystem
: '''Vorsicht!'''
<syntaxhighlight lang="bash" line>
sudo find / -type f -exec rename -n 's/\A(.{100}).*(\.[^.]+)\z/$1$2/s' {} +
</syntaxhighlight>
Das -n gibt erst mal nur die Änderungen aus


====== Teile aus dem Dateinamen entfernen ======
=== Komplexere Operationen am Dateinamen ===
* Es gibt viele Situationen, in denen man Teile des Dateinamens entfernt haben möchte.
Natürlich sind auch komplexere Operationen mit „rename“ möglich, welche jedoch ein erweitertes Verständnis der „perl regular expressions“ und bisweilen auch einen großen Zeitaufwand mit sich bringen
* Bei Musiktiteln will man den Namen des Albums beziehungsweise des Interpreten loswerden, bei Bildern doppelt vorhandene Endungen oder überhaupt zuviele Leerzeichen und Bindestriche.
* Anbei nur ein Beispiel, wie man die Dateigröße an den Dateinamen anhängen kann
rename 's/Amelie//g' *
<syntaxhighlight lang="bash" line>
rename 's/Amelie \(Soundtrack\) - //g' *
rename -n 's/$/",size=".(-s)/e' *.jpg
rename 's/ -//g' *
</syntaxhighlight>


* Das erste Beispiel entfernt das Wort „Amelie“, das zweite Beispiel die gesamte Zeichenfolge „Amelie \(Soundtrack\) - “ aus dem Namen aller Dateien im aktuellen Verzeichnis.
Oftmals sind allerdings umfangreichere Scripts nötig, da viele Linux-Befehle darunter leider auch „rename“ Ordnerstrukturen nicht rekursiv abarbeiten könne
* Beachten, dass allfällige Sonderzeichen im Suchbegriff in diesem Fall die runden Klammern immer mit einem Backslash gekennzeichnet werden müssen.
* Hier helfen meistens Schlaufen mit Hilfe des Befehl „find“ und Umbennenungen mit „mv“ weiter
* Das letzte Beispiel zeigt, dass man auch mehrere Leerzeichen problemlos aus dem Dateinamen entfernen kann.


====== Teile innerhalb des Dateinamens ersetzen ======
=== Beispiele ===
Neben dem Entfernen ungewollter Teile aus dem Dateinamen besteht oftmals auch die Notwendigkeit, einzelne Wörter, Buchstaben oder Zeichen zu ersetzen. wie bereits vorhin erwähnt, muss hier ein besonderes Augenmerk auf das „Escapen“ der Sonderzeichen gelegt werden.
Um zum Beispiel alle Dateien mit der Endung "*.bak" umzubenennen, könnten Sie sagen
<syntaxhighlight lang="bash" line>
file-rename -- 's/\.bak$//' *.bak
</syntaxhighlight>


rename 's/ /_/g' * oder rename 's/\s+/_/g' *
To translate uppercase names to lower, you'd use
rename 's/-/./g' *
<syntaxhighlight lang="bash" line>
rename 's/\'/’/g' *
file-rename 'y/A-Z/a-z/' ./*
rename 's/^/Amélie_Soundtrack_/' *.ogg
</syntaxhighlight>
rename 's/ogg$/ogn/' *.ogg


* Das erste Beispiel ersetzt alle Leerzeichen durch Unterstriche, das zweite alle Bindestriche durch Punkte und das dritte alle falschen Apostrophe durch typographisch richtige im Namen aller Dateien im aktuellen Verzeichnis.
Beispiele wurden umgeschrieben, um Globs zu vermeiden, die Optionen einfügen könnten
* Die beiden letzten Beispiele benutzen die Sonderzeichen ^ (= Anfang der Zeile) und $ (= Ende der Zeile), um das Ersetzen auf einen bestimmten Bereich des Dateinamens einzugrenzen; daher kann auch das g für global wegfallen.
* Um zu Testen, wie wichtig das „Escapen“ der Sonderzeichen ist, versuchen sie einmal die beiden Befehle „rename 's/ /./g' *“ und „rename 's/./ /g' *“ hintereinander.
** Dummerweise steht der Punkt in den Regular Expressions für "irgendein Zeichen", d. h. der letzte Befehl ersetzt jedes Zeichen im Dateinamen durch ein Leerzeichen!
* Der korrekte zweite Befehl muss daher „rename 's/\./ /g' *“ lauten – und zum Retten der Dateiendung anschliessend noch „rename 's/ ogg$/.ogg/g' *“.


====== Gross- und Kleinschreibung des Dateinamens manipulieren ======
Sie können auch rename verwenden, um Dateien zwischen Verzeichnissen zu verschieben, möglicherweise gleichzeitig mit anderen Änderungen (siehe aber --filename)
* Die Gross- und Kleinschreibung eines Dateinamens lässt sich ebenfalls sehr einfach mit einem „Einzeiler“ ändern, wobei dies den gesamten Dateinamen, aber auch nur Teile davon betreffen kann.
<syntaxhighlight lang="bash" line>
file-rename 'y/A-Z/a-z/;s/^/my_new_dir\//' ./*.*
</syntaxhighlight>
Sie können die Aussagen auch getrennt schreiben (siehe -e/-E)
<syntaxhighlight lang="bash" line>
file-rename -E 'y/A-Z/a-z/' -E 's/^/my_new_dir\//' -- *.*
</syntaxhighlight>
Sie können die vordefinierten Variablen "$a, $b" im Code verwenden; zum Beispiel um Zahlenfolgen zu erstellen
<syntaxhighlight lang="bash" line>
rename -e '$a++;s/\w+/file_$a/' -- *.*
</syntaxhighlight>


rename 'y/[A-Z]/[a-z]/' *
== Aufruf ==
rename 's/\.JPG/\.jpg/g' *.JPG
<syntaxhighlight lang="bash" line>
rename 's/^\w/\U$&/g' *
file-rename [ -h|-m|-V ] [ -v ] [ -0 ] [ -n ] [ -f ] [ -d ] [ -u [encoding]] [ -e|-E perlexpr]*|perlexpr [ files ]
</syntaxhighlight>


* Das erste Beispiel ersetzt alle grossgeschriebenen Buchstaben durch kleingeschriebene. Da hier nicht nach einem einzelnen zusammenhängenden Begriff gesucht, sondern ein ganzer Buchstabenbereich analysiert wird und einzelne Zeichen mit einem korrespondierenden Zeichen (eben ein A durch ein a und ein Z durch ein z) ersetzt werden, muss anstelle des s ein y (transliteration) gesetzt werden.  
=== Optionen ===
{| class="wikitable sortable options"
|-
! Unix !! GNU !! Parameter ||Beschreibung
|-
| -v || --verbose || || Namen der erfolgreich umbenannten Dateien ausgeben
|-
| -0 || --null || || \0 als Zeilentrennzeichen beim Lesen von STDIN verwenden
|-
| -n || --nono || || Keine Aktion: Namen der umzubenennenden Dateien ausgeben, aber nicht umbenennen
|-
| -f || --force || || Überschreiben erzwingen
|-
| || --path, --fullpath || || Vollständigen Pfad umbenennen: einschließlich aller Verzeichniskomponenten. DEFAULT
|-
| -d || --filename, --nopath, --nofullpath || || Nur Dateinamen ändern, nicht Verzeichnisnamen
|-
| -h || --help || || Syntax und Optionen ausgeben
|-
| -m || --man || || Handbuchseite ausgeben
|-
| -V || --version || || Versionsnummer anzeigen
|-
| -u || --unicode || [encoding] || Behandelt Dateinamen als Perl (Unicode)-Strings, wenn der vom Benutzer gelieferte Code ausgeführt wird. Dekodierung/Kodierung von Dateinamen unter Verwendung der Kodierung, falls vorhanden. Die Kodierung ist optional: wenn sie weggelassen wird, sollte das nächste Argument eine Option sein, die mit '-' beginnt, zum Beispiel -e
|-
| -e || || || Ausdruck: Code, der auf den Dateinamen wirkt. Kann wiederholt werden, um den Code aufzubauen (wie "perl -e"). Wenn kein -e, wird das erste Argument als Code verwendet
* Das Argument perlexpr ist ein Perl-Ausdruck, von dem erwartet wird, dass er die Zeichenkette $_ in Perl zumindest für einige der angegebenen Dateinamen ändert
|-
| -E || || || Anweisung: Code, der auf den Dateinamen wirkt, wie -e, aber mit ';' abgeschlossen
* Das Argument perlexpr ist ein Perl-Ausdruck, von dem erwartet wird, dass er die Zeichenkette $_ in Perl zumindest für einige der angegebenen Dateinamen ändert
|}


* Das zweite Beispiel hingegen ersetzt wiederum nur einen einzigen Begriff, nämlich das gross geschriebene „.JPG“ durch ein klein geschriebenes „.jpg“, daher die bekannte Kombination „'s/ / /g'“.
=== Parameter ===
; [Files]
* Wenn ein gegebener Dateiname nicht durch den Ausdruck verändert wird, wird er nicht umbenannt
* Wenn in der Befehlszeile keine Dateinamen angegeben werden, werden die Dateinamen über die Standardeingabe gelesen


* Das letzte Beispiel sieht ein wenig komplex aus, ist aber leicht erklärt: es wir nach dem Wort (\w) am Anfang (^) der Zeile (/s) gesucht, dann aber nur der erste Buchstabe ($&) gross geschrieben (\U).
=== Umgebungsvariablen ===
keine


====== Teile des Dateinamens umbauen und ergänzen ======
=== Exit-Status ===
* Insbesondere bei größeren digitalen Bildersamlungen möchte man gerne die nichtssagenden Zahlen im Namen, welche von der Digitalkamera generiert werden, durch aussagekräftige Dateinamen ersetzten.
* Auch dies ist mit „rename“ problemlos möglich.


rename 's/(\d{8})\.JPG$/Türkeiferien_$1\.jpg/' *.JPG
rename 's/\d{5}(\d{3})\.JPG$/Türkeiferien_$1\.jpg/' *.JPG


* Obiges Beispiel nimmt die ersten acht Zahlen (\d{8}) des Dateinamens aller auf JPG-Dateien (\.JPG) und speichert diese für die spätere Weiterverwendung (daher die runden Klammern um \d{8} herum).
== Installation ==
* Der neue Dateiname besteht aus der Bezeichnung „Türkeiferien_“ und der vorhin gespeicherten acht Zahlen, die mittels der Variablen $1 angehängt werden; zudem wird die Dateiendung noch in Kleinbuchstaben (\.jpg)umgewandelt.
<syntaxhighlight lang="bash" line>
* Das zweite Bbeispiel ist sogar noch ein wenig ausgefeilter, denn es speichert nur die letzten drei Zahlen ((\d{3})) des alten achtzahligen Dateinamens, um sie nachher an die Bezeichnung „Türkeiferien_“ anzufügen.
sudo apt install rename
* Neben dem regulären Ausdruck für „irgendeine Zahl, aber kein Buchstabe“ (\d) gibt es natürlich auch noch denjenigen für „irgendeinen Buchstaben, aber keine Zahl“ (\w) oder deren Umkehrung „alles, nur keine Zahl“ (\D) und „alles, nur keinen Buchstaben“ (\W).
</syntaxhighlight>
* Leerzeichen können entweder als solche gesetzt werden (siehe erste Beispiele weiter oben) oder aber mit dem regulären Ausdruck \s – oder natürlich auch mit dessen Umkehr \S („alles, ausser Leerezeichen“) – aufgespürt werden.
 
== Konfiguration ==
=== Dateien ===


====== Komplexere Operationen am Dateinamen ======
<noinclude>
* Natürlich sind auch komplexere Operationen mit „rename“ möglich, welche jedoch ein erweitertes Verständnis der „perl regular expressions“ und bisweilen auch einen großen Zeitaufwand mit sich bringen. Anbei nur ein Beispiel, wie man die Dateigröße an den Dateinamen anhängen kann:


rename -n 's/$/",size=".(-s)/e' *.jpg
== Anhang ==
=== Siehe auch ===
{{Special:PrefixIndex/{{BASEPAGENAME}}}}


* Oftmals sind allerdings umfangreichere Scripts nötig, da viele Linux-Befehle – darunter leider auch „rename“ – Ordnerstrukturen nicht rekursiv abarbeiten könne. Hier helfen meistens Schlaufen mit Hilfe des Befehl „find“ und Umbennenungen mit „mv“ weiter.
==== Dokumentation ====
'''topic''' kurze Beschreibung
===== Man-Page =====
# rename(1p)
# mv(1)
# perl(1)
 
==== Links ====
===== Projekt =====
===== Weblinks =====


[[Kategorie:Linux/Dateien]]
{{DEFAULTSORT:rename}}
{{DEFAULTSORT:rename}}
{{DISPLAYTITLE:rename}}
[[Kategorie:Linux/Datei/Name]]
[[Kategorie:Linux/Datei/Verwaltung]]
[[Kategorie:Linux/Dateisystem/Bereinigen]]
[[Kategorie:Linux/Dateisystem/Befehl]]
[[Kategorie:Zeichenkodierung]]
[[Kategorie:Linux/Befehl]]
[[Kategorie:Linux/Befehl]]
</noinclude>

Aktuelle Version vom 12. November 2024, 18:36 Uhr

rename - (file-rename) Dateien nach Regeln umbenennen

Beschreibung

file-rename benennt Dateinamen gemäß angegebener Regel um

Anwendungen

rename DSC 2002_10_14- *.jpg
rename "s/^DSC/2002_10_14-/" *.jpg
  1. Beide Zeilen erledigen die gleiche Aufgabe
  2. Die zweiter Version bietet die volle Mächtigkeit von Regulären Ausdrücken

Das Umbenennen einer einzelnen Datei ist keine große Herausforderung

  • Doch wie ist vorzugehen, wenn man Hunderte oder Tausende von Dateien – z. B.  Fotos aus einer Digitalkamera oder die eigene Musiksammlung – in einem einzelnen Ordner oder in vielen Unterordnern umbenennen muss?
  • Im grafischen Dateimanager alles markieren und umbenennen funktioniert nicht und jede Datei einzeln umbenennen, dauert viel zu lange
Reguläre Ausdrücke

Unter Linux hilft hier „rename“ in Kombination mit den sogenannten „perl regular expressions“ weiter.

  • „Reguläre Ausdrücke“ sind eine Art „Zwischenabfrage“, welche den Dateinamen vor dem eigentlichen Umbenennen durch „rename“ analysieren
Aktionen
  • Für die meisten Aktionen reicht der Zusatz 's/suchbegriff/ersetzung/g' mitzugeben, wobei s für „single line“ (Ausdruck muss auf einer Zeile stehen) und g für „global“ (ersetzen, sooft der Ausdruck gefunden wird) steht
  • Soll ohne Unterscheidung von Gross- und Kleinschreibung gesucht werden, dann kann Am Ende noch ein i für insensitive (egal, ob groß oder kleingeschrieben) mitgegeben werden

Teile aus dem Dateinamen entfernen

Es gibt viele Situationen, in denen man Teile des Dateinamens entfernt haben möchte

  • Bei Musiktiteln will man den Namen des Albums beziehungsweise des Interpreten loswerden, bei Bildern doppelt vorhandene Endungen oder überhaupt zuviele Leerzeichen und Bindestriche
rename 's/Amelie//g' *
rename 's/Amelie \(Soundtrack\) - //g' *
rename 's/ -//g' *
  1. Das erste Beispiel entfernt das Wort „Amelie“, das zweite Beispiel die gesamte Zeichenfolge „Amelie \(Soundtrack\) - “ aus dem Namen aller Dateien im aktuellen Verzeichnis
  2. Beachten, dass allfällige Sonderzeichen im Suchbegriff – in diesem Fall die runden Klammern – immer mit einem Backslash gekennzeichnet werden müssen
  3. Das letzte Beispiel zeigt, dass man auch mehrere Leerzeichen problemlos aus dem Dateinamen entfernen kann

Teile innerhalb des Dateinamens ersetzen

Neben dem Entfernen ungewollter Teile aus dem Dateinamen besteht oftmals auch die Notwendigkeit, einzelne Wörter, Buchstaben oder Zeichen zu ersetzen

  • wie bereits vorhin erwähnt, muss hier ein besonderes Augenmerk auf das „Escapen“ der Sonderzeichen gelegt werden
rename 's/ /_/g' * oder rename 's/\s+/_/g' *
rename 's/-/./g' *
rename 's/\'/’/g' *
rename 's/^/Amélie_Soundtrack_/' *.ogg
rename 's/ogg$/ogn/' *.ogg
  1. Das erste Beispiel ersetzt alle Leerzeichen durch Unterstriche
  2. das zweite alle Bindestriche durch Punkte
  3. das dritte alle falschen Apostrophe durch typografisch richtige im Namen aller Dateien im aktuellen Verzeichnis
  4. Die beiden letzten Beispiele benutzen die Sonderzeichen ^ (= Anfang der Zeile) und $ (= Ende der Zeile), um das Ersetzen auf einen bestimmten Bereich des Dateinamens einzugrenzen; daher kann auch das g für global wegfallen

Um zu Testen, wie wichtig das „Escapen“ der Sonderzeichen ist, versuchen sie einmal die beiden Befehle „rename 's/ /./g' *“ und „rename 's/./ /g' *“ hintereinander

  • Dummerweise steht der Punkt in den Regular Expressions für "irgendein Zeichen", d. h. der letzte Befehl ersetzt jedes Zeichen im Dateinamen durch ein Leerzeichen!
  • Der korrekte zweite Befehl muss daher „rename 's/\./ /g' *“ lauten – und zum Retten der Dateiendung anschließend noch „rename 's/ ogg$/.ogg/g' *“

Gross- und Kleinschreibung des Dateinamens manipulieren

  • Die Gross- und Kleinschreibung eines Dateinamens lässt sich ebenfalls sehr einfach mit einem „Einzeiler“ ändern, wobei dies den gesamten Dateinamen, aber auch nur Teile davon betreffen kann
rename 'y/[A-Z]/[a-z]/' *
rename 's/\.JPG/\.jpg/g' *.JPG
rename 's/^\w/\U$&/g' *
  1. Das erste Beispiel ersetzt alle großgeschriebenen Buchstaben durch kleingeschriebene
    Da hier nicht nach einem einzelnen zusammenhängenden Begriff gesucht, sondern ein ganzer Buchstabenbereich analysiert wird und einzelne Zeichen mit einem korrespondierenden Zeichen (eben ein A durch ein a und ein Z durch ein z) ersetzt werden, muss anstelle des s ein y (transliteration) gesetzt werden
  2. Das zweite Beispiel hingegen ersetzt wiederum nur einen einzigen Begriff, nämlich das gross geschriebene „.JPG“ durch ein klein geschriebenes „.jpg“, daher die bekannte Kombination „'s/ / /g'“
  3. Das letzte Beispiel sieht ein wenig komplex aus, ist aber leicht erklärt: es wir nach dem Wort (\w) am Anfang (^) der Zeile (/s) gesucht, dann aber nur der erste Buchstabe ($&) grossgeschrieben (\U)

Dateinamen umbauen und ergänzen

Teile des Dateinamens umbauen und ergänzen

Insbesondere bei größeren digitalen Bildersammlungen möchte man gerne die nichtssagenden Zahlen im Namen, welche von der Digitalkamera generiert werden, durch aussagekräftige Dateinamen ersetzten

  • Auch dies ist mit „rename“ problemlos möglich
rename 's/(\d{8})\.JPG$/Türkeiferien_$1\.jpg/' *.JPG
rename 's/\d{5}(\d{3})\.JPG$/Türkeiferien_$1\.jpg/' *.JPG
  1. Obiges Beispiel nimmt die ersten acht Zahlen (\d{8}) des Dateinamens aller auf JPG-Dateien (\.JPG) und speichert diese für die spätere Weiterverwendung (daher die runden Klammern um \d{8} herum)
    • Der neue Dateiname besteht aus der Bezeichnung „Türkeiferien_“ und der vorhin gespeicherten acht Zahlen, die mittels der Variablen $1 angehängt werden; zudem wird die Dateiendung noch in Kleinbuchstaben (\.jpg)umgewandelt
  2. Das zweite Beispiel ist sogar noch ein wenig ausgefeilter, denn es speichert nur die letzten drei Zahlen ((\d{3})) des alten achtzahligen Dateinamens, um sie nachher an die Bezeichnung „Türkeiferien_“ anzufügen
    • Neben dem regulären Ausdruck für „irgendeine Zahl, aber kein Buchstabe“ (\d) gibt es natürlich auch noch denjenigen für „irgendeinen Buchstaben, aber keine Zahl“ (\w) oder deren Umkehrung „alles, nur keine Zahl“ (\D) und „alles, nur keinen Buchstaben“ (\W)
    • Leerzeichen können entweder als solche gesetzt werden (siehe erste Beispiele weiter oben) oder aber mit dem regulären Ausdruck \s – oder natürlich auch mit dessen Umkehr \S („alles, außer Leerzeichen“) – aufgespürt werden

Dateinamen kürzen

rename -n 's/(.{100}).*(\.pdf)/$1$2/xms' *.pdf
Unterverzeichnisse

ersetze das *.pdf durch ein **/*.pdf

find -name '*.pdf' -exec rename -n 's/(.{100}).*(\.pdf)/$1$2/xms' {} +

Das -n gibt erst mal nur die Änderungen aus

Alle Dateitypen, gesamtes Dateisystem
Vorsicht!
sudo find / -type f -exec rename -n 's/\A(.{100}).*(\.[^.]+)\z/$1$2/s' {} +

Das -n gibt erst mal nur die Änderungen aus

Komplexere Operationen am Dateinamen

Natürlich sind auch komplexere Operationen mit „rename“ möglich, welche jedoch ein erweitertes Verständnis der „perl regular expressions“ und bisweilen auch einen großen Zeitaufwand mit sich bringen

  • Anbei nur ein Beispiel, wie man die Dateigröße an den Dateinamen anhängen kann
rename -n 's/$/",size=".(-s)/e' *.jpg

Oftmals sind allerdings umfangreichere Scripts nötig, da viele Linux-Befehle – darunter leider auch „rename“ – Ordnerstrukturen nicht rekursiv abarbeiten könne

  • Hier helfen meistens Schlaufen mit Hilfe des Befehl „find“ und Umbennenungen mit „mv“ weiter

Beispiele

Um zum Beispiel alle Dateien mit der Endung "*.bak" umzubenennen, könnten Sie sagen

file-rename -- 's/\.bak$//' *.bak

To translate uppercase names to lower, you'd use

file-rename 'y/A-Z/a-z/' ./*

Beispiele wurden umgeschrieben, um Globs zu vermeiden, die Optionen einfügen könnten

Sie können auch rename verwenden, um Dateien zwischen Verzeichnissen zu verschieben, möglicherweise gleichzeitig mit anderen Änderungen (siehe aber --filename)

file-rename 'y/A-Z/a-z/;s/^/my_new_dir\//' ./*.*

Sie können die Aussagen auch getrennt schreiben (siehe -e/-E)

file-rename -E 'y/A-Z/a-z/' -E 's/^/my_new_dir\//' -- *.*

Sie können die vordefinierten Variablen "$a, $b" im Code verwenden; zum Beispiel um Zahlenfolgen zu erstellen

rename -e '$a++;s/\w+/file_$a/' -- *.*

Aufruf

file-rename [ -h|-m|-V ] [ -v ] [ -0 ] [ -n ] [ -f ] [ -d ] [ -u [encoding]] [ -e|-E perlexpr]*|perlexpr [ files ]

Optionen

Unix GNU Parameter Beschreibung
-v --verbose Namen der erfolgreich umbenannten Dateien ausgeben
-0 --null \0 als Zeilentrennzeichen beim Lesen von STDIN verwenden
-n --nono Keine Aktion: Namen der umzubenennenden Dateien ausgeben, aber nicht umbenennen
-f --force Überschreiben erzwingen
--path, --fullpath Vollständigen Pfad umbenennen: einschließlich aller Verzeichniskomponenten. DEFAULT
-d --filename, --nopath, --nofullpath Nur Dateinamen ändern, nicht Verzeichnisnamen
-h --help Syntax und Optionen ausgeben
-m --man Handbuchseite ausgeben
-V --version Versionsnummer anzeigen
-u --unicode [encoding] Behandelt Dateinamen als Perl (Unicode)-Strings, wenn der vom Benutzer gelieferte Code ausgeführt wird. Dekodierung/Kodierung von Dateinamen unter Verwendung der Kodierung, falls vorhanden. Die Kodierung ist optional: wenn sie weggelassen wird, sollte das nächste Argument eine Option sein, die mit '-' beginnt, zum Beispiel -e
-e Ausdruck: Code, der auf den Dateinamen wirkt. Kann wiederholt werden, um den Code aufzubauen (wie "perl -e"). Wenn kein -e, wird das erste Argument als Code verwendet
  • Das Argument perlexpr ist ein Perl-Ausdruck, von dem erwartet wird, dass er die Zeichenkette $_ in Perl zumindest für einige der angegebenen Dateinamen ändert
-E Anweisung: Code, der auf den Dateinamen wirkt, wie -e, aber mit ';' abgeschlossen
  • Das Argument perlexpr ist ein Perl-Ausdruck, von dem erwartet wird, dass er die Zeichenkette $_ in Perl zumindest für einige der angegebenen Dateinamen ändert

Parameter

[Files]
  • Wenn ein gegebener Dateiname nicht durch den Ausdruck verändert wird, wird er nicht umbenannt
  • Wenn in der Befehlszeile keine Dateinamen angegeben werden, werden die Dateinamen über die Standardeingabe gelesen

Umgebungsvariablen

keine

Exit-Status

Installation

sudo apt install rename

Konfiguration

Dateien

Anhang

Siehe auch

Dokumentation

Man-Page
  1. rename(1p)
  2. mv(1)
  3. perl(1)

Links

Projekt
Weblinks