Ersetzen Sie alle ungültigen Zeichen aus Ordnern, Unterordnern und Dateien in meinem Dropbox-Ordner

752
Todd C

Unser Büro verwendet Dropbox auf Macs, um unsere Designprojekte zu organisieren. Viele dieser Dateien und Ordner wurden über mehrere Jahre mit Zeichen gespeichert, die unter Windows nicht zulässig sind. Wir haben einige Windows-Betriebssysteme, die wir unserem Büro hinzufügen müssen. Dies hat zu einem Problem geführt, da keine dieser Dateien ordnungsgemäß synchronisiert wird.

Ich weiß sehr wenig über das Ausführen von OSX-Skripts, bin aber auf dieses Handbuch gestoßen, das fast das tut, was ich brauche, es sei denn, ich brauche es, um in allen Unterordnern und Dateien zu funktionieren. Die Person hat ein in ein Programm eingebettetes Automatorskript erstellt.

Entfernen Sie alle ungültigen Zeichen aus allen Dateinamen in einem bestimmten Ordner

Kann ein solches Skript auch alle Unterordner und Dateien enthalten? Dieses Skript entfernt alle Leerzeichen und Sonderzeichen, aber ein Ersetzen mit einem Unterstrich wäre viel besser, wenn dies möglich ist.

Vielen Dank

0

1 Antwort auf die Frage

0
G-Man
  • Der einfache Weg zu bekommen slhck Skript Unterordner und Dateien rekursiv zu durchsuchen, wenn Sie bash verwenden, ist hinzuzufügen, shopt -s globstarund ä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 ein f@catVerzeichnis und ein dog#Verzeichnis darunter und ein fox!Verzeichnis darunter haben, müssen Sie das Skript viermal ausführen.

    Ich gebe das unten besser.

  • Das Skript von Slhck sollte wirklich sagen, mv -istatt mv. Wenn Sie Dateien benannt haben, zum Beispiel cost+taxund cost-tax, benennt das Skript beide um costtax (oder cost_taxnachdem wir diese Änderung vorgenommen haben). Dadurch wird die erste Datei mit der zweiten Datei gesäubert. Die -i( i nteractive) Option bewirkt, dass mvzur 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 $1Argument 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 $1mit Zweigen in der Reihenfolge von oben nach unten erweitert wird. Also, wenn Sie haben f@cat/dog#, wird es f@catund f@cat/dog#als Argumente sehen. Es wird also umbenannt f@catin f_catund 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 -depthOption können findSie Verzeichnisse in der Reihenfolge von unten nach oben anzeigen. Die -nameRichtlinie 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.)  findDann werden die Namen an eine Shell übergeben, die dasselbe Skript wie das Skript ausführt, jedoch als einzelnen Befehl .