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. renameist nicht verfügbar, und viele der Varianten von findfail schlagen fehl, da sie anscheinend am älteren Namen des bereits umbenannten Pfads festhalten (z. B. wird, wenn ./FOOgefolgt von ./FOO/BAR, das Umbenennen ./FOOin ./foowird 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/barvor ./foo), aber nur für Dateien , die einen Großbuchstaben enthalten. Der -nameFilter gilt nur für den Basisdateinamen, nicht für den vollständigen Pfad. Das wird also ./FOO/BARaber 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 -depthist 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 findund formatiert sie in einem mvBefehl mit einem regulären Ausdruck. Die -nOption stoppt das sedDrucken der Eingabe, und der pBefehl 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 findAusgänge ./FOO/BAR, wird es werden mv -n -v -T ./FOO/BAR ./FOO/bar. Die -nOption mvstellt sicher, dass vorhandene Kleinbuchstaben nicht überschrieben werden. Die -vOption gibt mvjede Änderung aus, die sie vornimmt (oder nicht vornimmt - falls sie ./FOO/barbereits vorhanden ist, gibt sie so etwas wie aus ./FOO/BAR -> ./FOO/BAR, wobei darauf hingewiesen wird, dass keine Änderung vorgenommen wurde). Das -Tist hier sehr wichtig - es behandelt die Zieldatei als Verzeichnis. Dadurch wird sichergestellt, dass das Verzeichnis ./FOO/BARnicht verschoben wird, ./FOO/barwenn 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 mvBefehle an den Shell-Interpreter weiter. Sie können es durch bashoder eine beliebige Hülle nach Ihren Wünschen ersetzen .
ABCdef,abcDEFundaBcDeF? 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