Rename: Unterschied zwischen den Versionen
Keine Bearbeitungszusammenfassung |
Keine Bearbeitungszusammenfassung |
||
Zeile 1: | Zeile 1: | ||
'''rename''' | '''rename''' (file-rename) - benennt mehrere Dateien um | ||
== Beschreibung == | == Beschreibung == | ||
"file-rename" benennt die angegebenen Dateinamen gemäß der als erstes Argument angegebenen Regel um | "file-rename" benennt die angegebenen Dateinamen gemäß der als erstes Argument angegebenen Regel um | ||
* 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 | |||
* 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 | |||
== Installation == | == Installation == | ||
Zeile 12: | Zeile 15: | ||
=== Optionen === | === Optionen === | ||
{|class="wikitable options" | |||
|- | |||
| -v || --verbose || Verbose: print names of files successfully renamed | |||
|- | |||
| -0 || --null || Use \0 as record separator when reading from STDIN | |||
|- | |||
| -n || --nono || No action: print names of files to be renamed, but don't rename | |||
|- | |||
| -f || --force || Over write: allow existing files to be over-written | |||
|- | |||
| || --path, --fullpath || Rename full path: including any directory component. DEFAULT | |||
|- | |||
| -d || --filename || , --nopath, --nofullpath || Do not rename directory: only rename filename component of path | |||
|- | |||
| -h || --help || Help: print SYNOPSIS and OPTIONS | |||
|- | |||
| -m || --man || Manual: print manual page | |||
|- | |||
| -V || --version || Version: show version number | |||
|- | |||
| -u || --unicode || [encoding] || Treat filenames as perl (unicode) strings when running the user-supplied code. Decode/encode filenames using encoding, if present. encoding is optional: if omitted, the next argument should be an option starting with '-', for instance -e | |||
|- | |||
| -e || || Expression: code to act on files name. May be repeated to build up code (like "perl -e"). If no -e, the first argument is used as code | |||
|- | |||
| -E || || Statement: code to act on files name, as -e but terminated by ';' | |||
|} | |||
=== Parameter === | === Parameter === | ||
=== Umgebungsvariablen === | === Umgebungsvariablen === | ||
keine | |||
=== Exit-Status === | === Exit-Status === | ||
== Anwendungen == | == Anwendungen == | ||
Zeile 20: | Zeile 50: | ||
rename DSC 2002_10_14- *.jpg | rename DSC 2002_10_14- *.jpg | ||
</syntaxhighlight> | </syntaxhighlight> | ||
oder | oder | ||
<syntaxhighlight lang="bash" line> | <syntaxhighlight lang="bash" line> | ||
rename "s/^DSC/2002_10_14-/" *.jpg | rename "s/^DSC/2002_10_14-/" *.jpg | ||
</syntaxhighlight> | </syntaxhighlight> | ||
* | Beide Zeilen erledigen den gleichen Job | ||
* Die zweiter Version bietet die volle Mächtigkeit von Regulären Ausdrücken | |||
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 | |||
* 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 | 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 | |||
* 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 gross oder klein geschrieben) 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> | <syntaxhighlight lang="bash" line> | ||
rename 's/Amelie//g' * | rename 's/Amelie//g' * | ||
Zeile 41: | Zeile 74: | ||
rename 's/ -//g' * | rename 's/ -//g' * | ||
</syntaxhighlight> | </syntaxhighlight> | ||
* Beachten, dass allfällige Sonderzeichen im Suchbegriff – in diesem Fall die runden Klammern – immer mit einem Backslash gekennzeichnet werden müssen | 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 === | === 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 | 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> | <syntaxhighlight lang="bash" line> | ||
rename 's/ /_/g' * oder rename 's/\s+/_/g' * | rename 's/ /_/g' * oder rename 's/\s+/_/g' * | ||
Zeile 54: | Zeile 90: | ||
rename 's/ogg$/ogn/' *.ogg | rename 's/ogg$/ogn/' *.ogg | ||
</syntaxhighlight> | </syntaxhighlight> | ||
# Das erste Beispiel ersetzt alle Leerzeichen durch Unterstriche | |||
# das zweite alle Bindestriche durch Punkte | |||
# das dritte alle falschen Apostrophe durch typographisch richtige im Namen aller Dateien im aktuellen Verzeichnis | |||
* Der korrekte zweite Befehl muss daher „rename 's/\./ /g' *“ lauten – und zum Retten der Dateiendung anschliessend noch „rename 's/ ogg$/.ogg/g' *“ | # 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 === | === 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 | * 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> | <syntaxhighlight lang="bash" line> | ||
rename 'y/[A-Z]/[a-z]/' * | rename 'y/[A-Z]/[a-z]/' * | ||
Zeile 67: | Zeile 108: | ||
rename 's/^\w/\U$&/g' * | rename 's/^\w/\U$&/g' * | ||
</syntaxhighlight> | </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 | |||
# 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 ($&) gross geschrieben (\U) | |||
=== Teile des Dateinamens umbauen und ergänzen === | |||
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 | |||
<syntaxhighlight lang="bash" line> | <syntaxhighlight lang="bash" line> | ||
rename 's/(\d{8})\.JPG$/Türkeiferien_$1\.jpg/' *.JPG | rename 's/(\d{8})\.JPG$/Türkeiferien_$1\.jpg/' *.JPG | ||
rename 's/\d{5}(\d{3})\.JPG$/Türkeiferien_$1\.jpg/' *.JPG | rename 's/\d{5}(\d{3})\.JPG$/Türkeiferien_$1\.jpg/' *.JPG | ||
</syntaxhighlight> | </syntaxhighlight> | ||
* 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 | * 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) | ||
* 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 | * 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 | ||
* 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) | * 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 | ||
* 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 | * 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, ausser Leerezeichen“) – aufgespürt werden | |||
=== Dateinamen kürzen === | === Dateinamen kürzen === | ||
<syntaxhighlight lang="bash" line> | <syntaxhighlight lang="bash" line> | ||
rename -n 's/(.{100}).*(\.pdf)/$1$2/xms' *.pdf | rename -n 's/(.{100}).*(\.pdf)/$1$2/xms' *.pdf | ||
</syntaxhighlight> | </syntaxhighlight> | ||
; Unterverzeichnisse | ; Unterverzeichnisse | ||
ersetze das *.pdf durch ein **/*.pdf | ersetze das *.pdf durch ein **/*.pdf | ||
Zeile 95: | Zeile 139: | ||
find -name '*.pdf' -exec rename -n 's/(.{100}).*(\.pdf)/$1$2/xms' {} + | find -name '*.pdf' -exec rename -n 's/(.{100}).*(\.pdf)/$1$2/xms' {} + | ||
</syntaxhighlight> | </syntaxhighlight> | ||
Das -n gibt erst mal nur die Änderungen aus | Das -n gibt erst mal nur die Änderungen aus | ||
; Alle Dateitypen, Gesamtes Dateisystem | ; Alle Dateitypen, Gesamtes Dateisystem | ||
Zeile 101: | Zeile 145: | ||
sudo find / -type f -exec rename -n 's/\A(.{100}).*(\.[^.]+)\z/$1$2/s' {} + | sudo find / -type f -exec rename -n 's/\A(.{100}).*(\.[^.]+)\z/$1$2/s' {} + | ||
</syntaxhighlight> | </syntaxhighlight> | ||
Das -n gibt erst mal nur die Änderungen aus | Das -n gibt erst mal nur die Änderungen aus | ||
=== Komplexere Operationen am Dateinamen === | === 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 | |||
<syntaxhighlight lang="bash" line> | <syntaxhighlight lang="bash" line> | ||
rename -n 's/$/",size=".(-s)/e' *.jpg | rename -n 's/$/",size=".(-s)/e' *.jpg | ||
</syntaxhighlight> | </syntaxhighlight> | ||
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 === | === Beispiele === | ||
Zeile 115: | Zeile 162: | ||
file-rename -- 's/\.bak$//' *.bak | file-rename -- 's/\.bak$//' *.bak | ||
</syntaxhighlight> | </syntaxhighlight> | ||
To translate uppercase names to lower, you'd use | To translate uppercase names to lower, you'd use | ||
<syntaxhighlight lang="bash" line> | <syntaxhighlight lang="bash" line> | ||
file-rename 'y/A-Z/a-z/' ./* | file-rename 'y/A-Z/a-z/' ./* | ||
</syntaxhighlight> | </syntaxhighlight> | ||
Beispiele wurden umgeschrieben, um Globs zu vermeiden, die Optionen einfügen könnten | |||
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) | Sie können auch rename verwenden, um Dateien zwischen Verzeichnissen zu verschieben, möglicherweise gleichzeitig mit anderen Änderungen (siehe aber --filename) | ||
Zeile 133: | Zeile 182: | ||
rename -e '$a++;s/\w+/file_$a/' -- *.* | rename -e '$a++;s/\w+/file_$a/' -- *.* | ||
</syntaxhighlight> | </syntaxhighlight> | ||
== Konfiguration == | == Konfiguration == | ||
=== Dateien === | === Dateien === | ||
<noinclude> | <noinclude> | ||
== Anhang == | == Anhang == |
Version vom 10. September 2024, 07:56 Uhr
rename (file-rename) - benennt mehrere Dateien um
Beschreibung
"file-rename" benennt die angegebenen Dateinamen gemäß der als erstes Argument angegebenen Regel um
- 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
- 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
Installation
sudo apt install rename
Syntax
file-rename [ -h|-m|-V ] [ -v ] [ -0 ] [ -n ] [ -f ] [ -d ] [ -u [enc]] [ -e|-E perlexpr]*|perlexpr [ files ]
Optionen
-v | --verbose | Verbose: print names of files successfully renamed | |
-0 | --null | Use \0 as record separator when reading from STDIN | |
-n | --nono | No action: print names of files to be renamed, but don't rename | |
-f | --force | Over write: allow existing files to be over-written | |
--path, --fullpath | Rename full path: including any directory component. DEFAULT | ||
-d | --filename | , --nopath, --nofullpath | Do not rename directory: only rename filename component of path |
-h | --help | Help: print SYNOPSIS and OPTIONS | |
-m | --man | Manual: print manual page | |
-V | --version | Version: show version number | |
-u | --unicode | [encoding] | Treat filenames as perl (unicode) strings when running the user-supplied code. Decode/encode filenames using encoding, if present. encoding is optional: if omitted, the next argument should be an option starting with '-', for instance -e |
-e | Expression: code to act on files name. May be repeated to build up code (like "perl -e"). If no -e, the first argument is used as code | ||
-E | Statement: code to act on files name, as -e but terminated by ';' |
Parameter
Umgebungsvariablen
keine
Exit-Status
Anwendungen
rename DSC 2002_10_14- *.jpg
oder
rename "s/^DSC/2002_10_14-/" *.jpg
Beide Zeilen erledigen den gleichen Job
- Die zweiter Version bietet die volle Mächtigkeit von Regulären Ausdrücken
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
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
- 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 gross oder klein geschrieben) 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' *
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
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
- Das erste Beispiel ersetzt alle Leerzeichen durch Unterstriche
- das zweite alle Bindestriche durch Punkte
- das dritte alle falschen Apostrophe durch typographisch richtige im Namen aller Dateien im aktuellen Verzeichnis
- 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
- 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' *
- 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
- 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 ($&) gross geschrieben (\U)
Teile des Dateinamens umbauen und ergänzen
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)
- 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 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
- 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, ausser Leerezeichen“) – 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
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/' -- *.*
Konfiguration
Dateien
Anhang
Siehe auch
Dokumentation
Man-Pages
- rename(1p)
- mv(1)
- perl(1)
Links
Projekt
Weblinks