Wie tausche ich mithilfe der Shell Wörter in einem Dateinamen aus?

Wie tausche ich mithilfe der Shell Wörter in einem Dateinamen aus?

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

  1. muss mit einem Buchstaben beginnen
  2. 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 -nSchalter 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 perlund verwenden mv.

verwandte Informationen