Ich versuche, Dateien wie folgt umzubenennen:
for file in *;
do
mv -i "$file" "$(echo "$file" | sed -e 's/[^A-Za-z0-9._-]/_/g')";
done
Der sed
Befehl ersetzt jedoch alle Leerzeichen durch _
.
Wie kann ich den sed
Befehl bearbeiten , um Leerzeichen zusammen mit den angegebenen Zeichen einzuschließen? Ich habe versucht, \s
aber es funktioniert nicht ...
BEARBEITEN:
Zum Beispiel: Die Datei trip: hill
sollte umbenannt werden: trip_ hill
aber der obige Befehl macht es trip__hill
.
command-line
bash
sed
batch-rename
Zanna
quelle
quelle
Antworten:
Analysieren Sie keine Dateinamen mit
sed
! Die Ausgabe von istecho "$file"
möglicherweise nicht zuverlässig.Verwenden Sie
rename
. Am 17.10 müssen Sie es zuerst installierenDann:
Anmerkungen
-n
Nach dem Testen entfernen , um die Dateien tatsächlich umzubenennen--
Ende der Optionen, falls eine Datei mit beginnt-
[^-A-Za-z0-9_ .]
Zeichen, die wir nicht ersetzen möchten - setzen Sie-
zuerst oder zuletzt, damit kein Bereich angegeben werden kann (dies wird an diesen Positionen wörtlich behandelt)..
wird wörtlich behandelt (in anderen Regex-Kontexten steht es für jedes Zeichen und muss maskiert werden).Dies funktioniert auch in
sed
:Wenn ich in Ihrer Version am Ende ein Leerzeichen hinzufüge, wird folgende Fehlermeldung angezeigt:
Aber
-
am Ende funktioniert es:Vielleicht hat die Position des Bindestrichs Ihr Problem verursacht, als Sie das Leerzeichen hinzugefügt haben. Aber der Rat, Dateinamen nicht zu analysieren, steht!
quelle
.
in einer Charakterklasse wörtlich ist. BIS!Sie können auch einfach die Shell verwenden. Die Parametererweiterung von Bash kann ersetzt werden:
Der doppelte Schrägstrich weist ihn an, alle Übereinstimmungen zu ersetzen, ansonsten ist die Syntax unkompliziert.
quelle