Verwenden Sie dies mit bash
:
find $1 -name "* *.xml" -type f -print0 | \
while read -d $'\0' f; do mv -v "$f" "${f// /_}"; done
find
sucht nach Dateien mit einem Leerzeichen im Namen. Die Dateinamen werden mit einem Nullbyte ( -print0
) als Trennzeichen gedruckt , um auch mit speziellen Dateinamen fertig zu werden. Dann read
liest das Builtin die durch das Nullbyte begrenzten Dateinamen und mv
ersetzt schließlich die Leerzeichen durch einen Unterstrich.
BEARBEITEN: Wenn Sie die Leerzeichen in den Verzeichnissen auch entfernen möchten, ist es ein bisschen komplizierter. Die Verzeichnisse werden umbenannt und sind dann nicht mehr über den Namen find erreichbar find
. Versuche dies:
find -name "* *" -print0 | sort -rz | \
while read -d $'\0' f; do mv -v "$f" "$(dirname "$f")/$(basename "${f// /_}")"; done
Das sort -rz
kehrt die Datei um, so dass die tiefsten Dateien in einem Ordner sind die ersten , sich zu bewegen und die Ordner selbst wird die letzte sein. Es werden also niemals Ordner umbenannt, bevor nicht alle Dateien und Ordner darin umbenannt wurden. Der mv
Befehl in der Schleife wurde ebenfalls etwas geändert. Im Zielnamen entfernen wir nur die Leerzeichen im Basisnamen der Datei, da sonst kein Zugriff möglich ist.
find . -name "* *" -print0 | sort -rz | \ while read -d $'\0' f; do mv -v "$f" "$(dirname "$f")/$(basename "${f// /_}")"; done
Verwenden
rename
oder mit
$1
Verwenden
mv
oder mit
$1
quelle
Dies ist eine Methode, die ich vor dem gleichen Problem gefunden habe:
Ich habe eine Bash-Skriptdatei geschrieben, um meine SSL-Zertifikate automatisch zu aktualisieren.
quelle
Verwendung
rename
:Keine Notwendigkeit für
find
:)quelle