Der einfache Weg zu bekommen slhck Skript Unterordner und Dateien rekursiv zu durchsuchen, wenn Sie bash verwenden, ist hinzuzufügen,
shopt -s globstar
und ändern Sie dann*
zu**
. Dies wird nicht korrekt funktionieren, wenn Sie Verzeichnisse mit „unzulässigen“ Zeichen in ihren Namen haben. Sie können dies umgehen, indem Sie das Skript n +1 Mal ausführen, wobei n die maximale Anzahl von Verzeichnissen mit ungültigen Zeichen in einem beliebigen Pfad ist. Wenn Sie beispielsweise einf@cat
Verzeichnis und eindog#
Verzeichnis darunter und einfox!
Verzeichnis darunter haben, müssen Sie das Skript viermal ausführen.Ich gebe das unten besser.
- Das Skript von Slhck sollte wirklich sagen,
mv -i
stattmv
. Wenn Sie Dateien benannt haben, zum Beispielcost+tax
undcost-tax
, benennt das Skript beide umcosttax
(odercost_tax
nachdem wir diese Änderung vorgenommen haben). Dadurch wird die erste Datei mit der zweiten Datei gesäubert. Die-i
( i nteractive) Option bewirkt, dassmv
zur Bestätigung fragen. Sie müssen solche Kollisionen manuell behandeln. - Um "illegale" Zeichen durch Unterstriche zu ersetzen, wechseln Sie
$
in$
(oder besser noch$
).
Also, mit den oben genannten Änderungen, slhck Skript wird
shopt -s globstar for f in "$1"/** do dir="$(dirname "$f")" file="$(basename "$f")" mv -i -- "$f" "$/$" done
Wenn Sie dies ausführen, geben Sie unbedingt ein Argument an (z. B. .
). Andernfalls wird versucht, alle Dateien im Dateisystem umzubenennen (beginnend bei /
). Sie sollten wahrscheinlich etwas in das Skript einfügen, um sicherzustellen, dass das $1
Argument nicht null ist.
Dies hat Probleme mit Verzeichnissen mit unzulässigen Zeichen im Namen, da das **
Verzeichnis zu einer Liste aller Dateien und Verzeichnisse im Unterbaum $1
mit Zweigen in der Reihenfolge von oben nach unten erweitert wird. Also, wenn Sie haben f@cat/dog#
, wird es f@cat
und f@cat/dog#
als Argumente sehen. Es wird also umbenannt f@cat
in f_cat
und dann gesucht f@cat/dog#
- was nicht mehr existiert, weil es umbenannt wurde f_cat/dog#
. Wir können das beheben, indem wir tun
find "$1" -depth -name '*[^0-9A-Za-z._]*' -exec sh -c \ 'for f do dir="$(dirname "$f")"; file="$(basename "$f")"; mv -i -- "$f" "$/$"; done' sh {} +
Mit dieser -depth
Option können find
Sie Verzeichnisse in der Reihenfolge von unten nach oben anzeigen. Die -name
Richtlinie bewirkt, dass es nur auf Dateinamen suchen, müssen umbenannt werden. (Das andere Skript gibt Fehlermeldungen aus, wenn versucht wird, Dateien in sich selbst umzubenennen, da deren Namen keine unzulässigen Zeichen enthalten.) find
Dann werden die Namen an eine Shell übergeben, die dasselbe Skript wie das Skript ausführt, jedoch als einzelnen Befehl .