
Hallo, ich habe eine Menge Dateien mit Leerzeichen im Namen. Gibt es eine Möglichkeit, sie in neue Dateien ohne Leerzeichen zu verschieben? Ich habe beispielsweise die Datei Hello World.pdf, die ich in Hello_World.pdf verschieben möchte. Für die eine Datei kann ich natürlich den Befehl mv verwenden, aber ich möchte dies mit allen Dateien in einem Ordner tun.
Danke
Antwort1
Du kannst den ... benutzentrodersedBefehle hierfür:
for file in *.pdf
do
newname=$(echo $file | tr ' ' _)
mv "$file" $newname
done
Beachten Sie, dass hier die neuere POSIX-Syntax zur Befehlsersetzung verwendet wird: $(Befehl).
Wenn Sie eine wirklich alte Bourne-Shell verwenden, müssen Sie Backticks verwenden:
newname=`echo $file | tr ' ' _`
Antwort2
Hier sind einige Skripte, die ich für diese Aufgabe verwende:
#!/bin/ksh
# Name : unspace - replace spaces by underscores in file names
# Usage : unspace [file ...]
# Example : unspace *.doc
unspace()
{
ls "$@" | while a=$(line)
do
file=$(echo $a | grep " ")
if [ -n "$file" ]
then
file="$(print "$file" | sed 's/ /_/g')"
print "$a" "->" "$file"
mv "$a" "$file"
fi
done
}
[[ "$(basename $0)" = unspace ]] && unspace "$@"
Das Folgende korrigiert rekursiv alle Namen im aktuellen Verzeichnis. Beachten Sie, dass noch etwas Arbeit erforderlich ist, wenn Verzeichnisnamen auch eingebettete Leerzeichen enthalten.
#!/bin/ksh
find . |
while a=$(line)
do
newName="$(print $a | tr ' ' '_')"
if [ "$a" != "$newName" ]
then
mv "$a" "$newName"
print $a moved
else
print $a unchanged
fi
done
Antwort3
Wenn Sie Bash haben, müssen Sie keine externen Tools aufrufen
for file in *.pdf
do
if [ -f "$file" ];then
echo mv "$file" "${file// /_}"
fi
done