find . -depth -name '*[A-Z]*'|sed -n 's/\(.*\/\)\(.*\)/mv -n -v -T \1\2 \1\L\2/p'|sh
Ich habe die hier erwähnten ausführlicheren Skripte nicht ausprobiert, aber keine der einzelnen Befehlszeilenversionen funktionierte auf meinem Synology NAS für mich. rename
ist nicht verfügbar, und viele der Varianten von find
fail schlagen fehl, da sie anscheinend am älteren Namen des bereits umbenannten Pfads festhalten (z. B. wird, wenn ./FOO
gefolgt von ./FOO/BAR
, das Umbenennen ./FOO
in ./foo
wird weiterhin aufgelistet./FOO/BAR
, obwohl dieser Pfad nicht mehr gültig ist). . Der obige Befehl funktionierte für mich ohne Probleme.
Was folgt, ist eine Erklärung für jeden Teil des Befehls:
find . -depth -name '*[A-Z]*'
Dadurch wird jede Datei aus dem aktuellen Verzeichnis (ändern finden .
, was auch immer Verzeichnis , das Sie bearbeiten wollen), eine Tiefensuche (zB., Wird es Liste ./foo/bar
vor ./foo
), aber nur für Dateien , die einen Großbuchstaben enthalten. Der -name
Filter gilt nur für den Basisdateinamen, nicht für den vollständigen Pfad. Das wird also ./FOO/BAR
aber nicht aufgelistet ./FOO/bar
. Dies ist in Ordnung, da wir nicht umbenennen möchten ./FOO/bar
. Wir möchten zwar umbenennen ./FOO
, aber dieses wird später aufgeführt (deshalb -depth
ist es wichtig).
Dieser Befehl an sich ist besonders nützlich, um die Dateien zu finden, die Sie zuerst umbenennen möchten. Verwenden Sie diese Option nach dem vollständigen Umbenennungsbefehl, um nach Dateien zu suchen, die aufgrund von Kollisionen oder Fehlern mit Dateinamen noch nicht ersetzt wurden.
sed -n 's/\(.*\/\)\(.*\)/mv -n -v -T \1\2 \1\L\2/p'
Dieser Teil liest die von ausgegebenen Dateien find
und formatiert sie in einem mv
Befehl mit einem regulären Ausdruck. Die -n
Option stoppt das sed
Drucken der Eingabe, und der p
Befehl im regulären Regex zum Suchen und Ersetzen gibt den ersetzten Text aus.
Der reguläre Ausdruck selbst besteht aus zwei Erfassungen: dem Teil bis zum letzten / (dem Verzeichnis der Datei) und dem Dateinamen selbst. Das Verzeichnis bleibt erhalten, aber der Dateiname wird in Kleinbuchstaben umgewandelt. Also, wenn find
Ausgänge ./FOO/BAR
, wird es werden mv -n -v -T ./FOO/BAR ./FOO/bar
. Die -n
Option mv
stellt sicher, dass vorhandene Kleinbuchstaben nicht überschrieben werden. Die -v
Option gibt mv
jede Änderung aus, die sie vornimmt (oder nicht vornimmt - falls sie ./FOO/bar
bereits vorhanden ist, gibt sie so etwas wie aus ./FOO/BAR -> ./FOO/BAR
, wobei darauf hingewiesen wird, dass keine Änderung vorgenommen wurde). Das -T
ist hier sehr wichtig - es behandelt die Zieldatei als Verzeichnis. Dadurch wird sichergestellt, dass das Verzeichnis ./FOO/BAR
nicht verschoben wird, ./FOO/bar
wenn es zufällig vorhanden ist.
Verwenden Sie dies zusammen mit find
, um eine Liste der Befehle zu erstellen, die ausgeführt werden (praktisch, um zu überprüfen, was getan wird, ohne es tatsächlich zu tun).
sh
Das ist ziemlich selbsterklärend. Es leitet alle generierten mv
Befehle an den Shell-Interpreter weiter. Sie können es durch bash
oder eine beliebige Hülle nach Ihren Wünschen ersetzen .
ABCdef
,abcDEF
undaBcDeF
? Sollte das Umbenennungsskript abbrechen oder nur warnen und fortfahren? 2. Wie definieren Sie Kleinbuchstaben für Nicht-US-ASCII-Namen? Wenn solche Namen vorhanden sein könnten, sollte zuerst eine Überprüfung und ein Ausschluss durchgeführt werden? 3. Wenn Sie eine Umbenennungsoperation ausführen