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 ?
\.
in die Muster aufnehmen.
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 ?
\.
in die Muster aufnehmen.
Antworten:
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:
rename
ist ein perl
Skript, das einen perl
regulä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 ras
wird wörtlich abgeglichen und \.
entspricht einem Literal .
(da .
nur ein anderes Zeichen als ein Zeilenvorschub angegeben wird), und das wird durch nichts ersetzt.
Die for
Schleife nimmt alle Dateien, die mit sw.ras.
(Standard Shell Glob) beginnen, und durchläuft sie. ${var/search/replace}
sucht $var
nach search
dem ersten Vorkommen und ersetzt es durch replace
, ${file/ras./}
kehrt also $file
mit 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.
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 .
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:]]
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 -
ras
, dh am Ende mitsw..001
, oder dasras.
verlassensw.001
?