Wie kann ich mehrere Dateien umbenennen, indem ich ein Zeichen oder eine Zeichenfolge entferne?

21

Als Antwort auf meine vorherige Frage , ob ich mehrere Dateien des Formulars habe

sw.ras.001
sw.ras.002
sw.ras.003
…

Welchen Befehl kann ich verwenden, um die ras.in der Mitte aller Dateien zu entfernen ?

Paul
quelle
Möchten Sie nur das entfernen ras, dh am Ende mit sw..001, oder das ras.verlassen sw.001?
Kevin
Ich würde wahrscheinlich das 'ras' entfernen wollen. Wäre der Befehl ganz anders?
Paul
Nein, nur ob Sie das \.in die Muster aufnehmen.
Kevin

Antworten:

35

Sie können dies mit einer ziemlich kleinen Modifikation der beiden Antworten der letzten Frage tun:

rename s/ras\.// sw.ras.*

oder

for file in sw.ras.*; do
    mv "$file" "${file/ras./}"
done

Erläuterung:

renameist ein perlSkript, das einen perlregulären Ausdruck und eine Liste von Dateien verwendet, die Regex nacheinander auf den Namen jeder Datei anwendet und jede Datei in das Ergebnis der Anwendung der Regex umbenennt. In unserem Fall raswird wörtlich abgeglichen und \.entspricht einem Literal .(da .nur ein anderes Zeichen als ein Zeilenvorschub angegeben wird), und das wird durch nichts ersetzt.

Die forSchleife nimmt alle Dateien, die mit sw.ras.(Standard Shell Glob) beginnen, und durchläuft sie. ${var/search/replace}sucht $varnach searchdem ersten Vorkommen und ersetzt es durch replace, ${file/ras./}kehrt also $filemit dem ersten ras.entfernten zurück. Der Befehl benennt die Datei also in den gleichen Namen minus um ras.. Beachten Sie, dass dieses Suchen und Ersetzen .wörtlich genommen wird und nicht als Sonderzeichen.

Kevin
quelle
Können Sie Ihre Antwort anderen erklären, von denen Sie lernen? Was tun "s / ras \ .// sw.ras. *"? Ich denke, ich weiß es, aber ich möchte sicher sein, und andere können auch lernen. Zweite Option auf die gleiche Weise.
H_7
1
@ H_7 Gute Idee, ich habe eine Erklärung hinzugefügt.
Kevin
14

Eine andere Option ist die Verwendung von mmv (Mass MoVe und Umbenennen):

mmv '*ras.*' '#1#2'

Vergessen Sie nicht, die einfachen Anführungszeichen um Ihre Muster zu verwenden, da sonst die Sterne auf der Shell-Ebene erweitert werden.

Das Dienstprogramm ist nicht immer verfügbar, aber wenn nicht, können Sie es installieren mit:

sudo apt-get install mmv

Siehe die Manpage hier .

alexg
quelle
1
Das ist ein tolles Werkzeug !!!
Christian
5

In jedem POSIX-compliant Schale ( bash, dash, ksh, usw.):

for file in sw.ras.[[:digit:]][[:digit:]][[:digit:]]; do
    mv "${file}" "${file/ras\./}"
done

Oder mit rename:

rename 's/ras\.//' sw.ras.[[:digit:]][[:digit:]][[:digit:]]
Chris Down
quelle
1

Vor kurzem musste ich eine Reihe von Dateien massenweise umbenennen, wobei ich das letzte Vorkommen eines Zeichens ersetzen musste, bei dem das Zeichen in den Dateinamen mehrfach vorkam. In diesem speziellen Fall hatte ich den letzten Strich ersetzen -mit einem Unterstrich _, drehen diese:

some-long-file-name.ext

das mögen:

some-long-file_name.ext

Es hat eine Weile gedauert, aber das hat es endlich geschafft:

for FILE in *; do mv $FILE ${FILE%-*}_${FILE##*-}; done

Hier:

  • ${i%-*} Entspricht dem Beginn des Dateinamens bis zum letzten Vorkommen des Bindestrichs -
  • ${file##*-} Stimmt mit dem Rest des Dateinamens nach dem letzten Vorkommen des Bindestrichs überein -
gopherIT
quelle