
Einer meiner Kunden ist eine Schule. Auf ihrem Dateiserver haben alle Projekte ein Verzeichnis mit demselben Benennungsschema.
<Nachname>, <Vorname> <Nachname>? - <Projektbeschreibung>
Zum Beispiel:
Miller, John Andrew - Ausführliche Projektbeschreibung Willis, Bruce - Beschreibung, evtl. mit Komma Lewis, Mary-Jane - Beschreibung - Einschließlich minus
Die neue Namenskonvention lautet:
<Vorname> <Nachname>? <Nachname> - <Projektbeschreibung>
Zum Beispiel:
John Andrew Miller - Ausführliche Projektbeschreibung Bruce Willis - Beschreibung, evtl. mit Komma Mary-Jane Lewis - Beschreibung - Einschließlich Minus
Wie kann man nun alle vorhandenen Ordner stapelweise gemäß der neuen Konvention umbenennen?
Antwort1
Da der Beschreibungsteil des Dateinamens das Muster -
(einen Bindestrich zwischen zwei Leerzeichen) enthalten kann, können Sie es in ein Symbol ändern, dasnichtim Beschreibungsteil vorkommen. Ich habe gewählt £
, aber das ist rein willkürlich.
rename 's/ - /£/' *
rename 's/([^,]*), ([^£]*)£/$2 $1 - /' *
s/ - /£/' tells rename to replace the first instance of
- it finds with
£ . The second command is a bit more complicated. Parenthases (
() ) are used to group selections together -- so everything that matches the pattern within the first set of parens can be called later as
$1 (all the way up to
$9 ).
[^,] means 'any character, except for
,';
means 'zero or more of the previous character';
[^,]` bedeutet „null oder mehr beliebige Zeichen außer einem Komma“. Da rename standardmäßig gierig ist, wird die längstmögliche Zeichenfolge abgeglichen.
Der Rest ergibt sich meiner Meinung nach ganz natürlich.
Wenn Sie nicht sicher sind, ob ein Symbol irgendwo im Dateinamen vorkommt, führen Sie einfach Folgendes aus:
printf '%s\n' *£*
Wenn Sie Perl-Rename haben:
rename 's/([^,]*), (.*) - /$2 $1 - /' *
Dies schlägt fehl, wenn der Beschreibungsteil des Dateinamens ein Zeichen -
(also ein -
zwischen zwei Leerzeichen) enthält.
Sie sollten dies mit dem Flag testen -n
, das keine Dateien umbenennt, sondern anzeigt, was eswürdegetan haben:
rename -n 's/([^,]*), (.*) - /$2 $1 - /' *
Antwort2
Was die Übereinstimmung betrifft, müssen Sie sehr vorsichtig sein, um etwas Robustes zu bauen. Wenn Sie beispielsweise davon ausgehen, dass der Vor- und Zweitname
- muss mit einem Buchstaben beginnen
- darf Bindestriche enthalten (aber keine anderen Satzzeichen oder Leerzeichen)
Ihr Vornamenmuster sieht dann etwa so aus [[:alpha:]][[:alpha:]-]*
: Sie können dann einen optionalen, durch Leerzeichen getrennten zweiten Vornamen als angeben, ((?: [[:alpha:]][[:alpha:]-]*)?)
wobei die zusätzliche nicht erfassende Gruppenstruktur nur dazu beiträgt, die Erfassungsgruppennummern gerade zu halten, wenn der zweite Vorname leer ist. Das Zusammensetzen erfolgt beispielsweise mit dem perlbasierten Befehl „rename“
rename -nv -- 's/(^[^,]*), ([[:alpha:]][[:alpha:]-]*)((?: [[:alpha:]][[:alpha:]-]*)?)/$2$3 $1/' *
oder (ermöglicht allgemeinere Leerzeichen zwischen den Feldern anstelle einzelner Leerzeichen)
rename -nv -- 's/(^[^,]*),\s+([[:alpha:]][[:alpha:]-]*)((?:\s+[[:alpha:]][[:alpha:]-]*)?)/$2$3 $1/' *
Der -n
Schalter ist ein No-Op, d. h. er führt die Umbenennungen erst durch, wenn er entfernt wird. Wenn Sie die Umbenennung nicht auf Perl-Basis durchführen können, können Sie eine Kombination aus perl
und verwenden mv
.