Finden Sie alle illegalen Windows-Zeichen in einem Ordner und Unterordner

Ich brauche ein Automator-Skript, das alle Dateien mit illegalen Windows-Zeichen wie findet <>:/\\|?*und diese Zeichen durch einen Unterstrich ersetzt. Der Rest des Dateinamens sollte unverändert bleiben.

Alternativ würde ich ein Terminalskript verwenden. Ich weiß, wie ich sie mit finden kann find . -name "*[<>:/\\|?*]*", aber ich weiß nicht, wie ich die Namen richtig ändern kann.

Wie mache ich das?

Seien Sie vorsichtig mit : - Sie haben wahrscheinlich keine Datei mit diesem Zeichen unter OS X. Ebenso - Scripting in Bash mit * ist voller Macht/Gefahr. Ich würde Ihre Entwicklung auf einer vollständig gesicherten Maschine durchführen.
Was ist mit illegalen Dateinamen? Sie können in Windows keine Datei namens "con" haben, wenn ich mich richtig erinnere

Antworten (1)

Ich habe einen Bash -Einzeiler gefunden , der jede Datei und jeden Ordner mit ungültigen Zeichen im Namen findet und die Datei/den Ordner umbenennt, wobei jedes ungültige Zeichen in einen Bindestrich geändert wird:

find . -name "*[<>:\\|?*]*" -exec bash -c 'x="{}"; y=$(sed "s/[<>:\\|?*]\+/-/g" <<< "$x") && mv -n "$x" "$y" ' \;

Es ist möglich, dass eine Datei einen illegalen Namen hat, der auf genau den gleichen legalen Namen wie eine andere illegal benannte Datei korrigiert würde (Beispiel: zwei Dateien mit dem Namen "fle"). Der obige Einzeiler ändert nicht den Namen der zweiten (oder weiteren) illegal benannten Datei, die auf den gleichen Namen wie die erste korrigiert würde. Das bedeutet, dass Sie nach den Einzeilern möglicherweise immer noch einige illegal benannte Dateien haben. Nachdem Sie diesen Einzeiler ausgeführt haben, führen Sie aus

find . -name "*[<>:\\|?*]*"

erneut, um illegal benannte Dateien zu identifizieren, die noch vorhanden sind. Eine Möglichkeit, mit dieser Situation umzugehen, besteht darin, den Gedankenstrich in der sed-Ersetzung durch ein anderes Zeichen zu ersetzen, z. B. einen Unterstrich, und den Einzeiler erneut auszuführen.