Ich versuche, alle Dateien in einem Ordner umzubenennen, wobei Unterstriche durch Leerzeichen ersetzt werden.
i.e. this_is_a_test --> this is a test
aber irgendwie vermassle ich das Zitat
> for file in * ; do echo mv -v $file $(echo $file | sed 's/_/\\ /g') ; done
mv -v this_is_a_test this\ is\ a\ test
das sieht in Ordnung aus, aber wenn ich das 'Echo' entferne, mv
beschwert man sich, als ob die Backslashes entfernt worden wären
> for file in * ; do mv -v $file $(echo $file | sed 's/_/\\ /g') ; done
mv: target ‘test’ is not a directory
Kann jemand auf den Fehler meiner Wege hinweisen?
command-line
bash
ottotts
quelle
quelle
Verwenden von
rename
:Wenn alles in Ordnung ist, entfernen Sie den
-n
Schalter:quelle
rename
Dienstprogramm. Funktioniert nicht für die Umbenennung inutil-linux
.Stattdessen
mv -v "$file" "$(echo $file | sed 's/_/\\ /g')"
können Sie einen viel einfacheren Befehl verwendenmv "$f" "${f//_/ }"
.So fügen Sie es in Ihr Skript ein:
Und das ist es.
quelle
sed
.Verwenden Sie den Befehl
find
undrename
:Dieser Befehl benennt alle Dateien mit einem
_
im Dateinamen rekursiv um.Erläuterung
-regex ".*_+.*"
Suchen Sie alle Dateien mit mindestens einer
_
im Dateinamen_
Ersetzen Sie alle Vorkommen von
_
…… Mit einem Leerzeichen (
)
Beispiel
quelle
-regex
wird hier nicht wirklich gebraucht,-name "*_*"
ist genugHier ist eine awk + for-Loop-Version:
for filename in *; do NEWNAME=$(echo "$filename" | awk '{gsub("_"," "); print}'); mv "$filename" "$NEWNAME";done
Und hier ist es in Aktion
Um Zeilenumbrüche und eine mögliche Umbenennung von Verzeichnissen zu berücksichtigen, finden Sie hier das typische IFS + find + read + while-Schleifenkonstrukt. Führen Sie nach dem Vorschlagen des Vorschlags zuerst die Version mit aus
find . -type d -print0
. Wenn Sie zuerst mit dem Umbenennen von Dateien beginnen und ein Unterverzeichnis einen Unterstrich enthält, wird der Dateiname nicht geändert. Kurz gesagt, kümmern Sie sich zuerst um Verzeichnisse und Unterverzeichnisse und dann um die DateienWie Sie sehen, gibt es ein kleines Problem: Da der Befehl find auch das aktuelle Verzeichnis auflistet (symbolisiert mit einem.), Erstellt der Befehl ein Nebenprodukt - eine Datei mit einem führenden Punkt.
Das Hinzufügen,
! -path .
wenn Sie mit Verzeichnissen arbeiten, löst das Problemquelle