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

711
Tim Moseley

Ich weiß, dass dies im Grunde beantwortet wurde und der Automator mit dem Shell-Skript (Sanitize Filenames) funktioniert großartig, aber ich brauche es auch, um alle Unterordner zu erstellen. Wenn möglich, reduzieren Sie den Dateinamen auf 50 Zeichen, wobei die Dateierweiterung beibehalten wird. Ich hatte eine Zeile mit Bash-Code gefunden, die die Datei abgeschnitten hat, aber auch die Erweiterung entfernt hat und die beim Übertragen dieser Dateien von Macs an Windows nicht gut funktioniert.

Das Skript ist so, wie es ist

for f in "$1"/*; do dir=$(dirname "$f") file=$(basename "$f") mv "$f" "$/$"  done  

Ich bin nicht dagegen, applescript in automator zu verwenden, um diese Aufgabe auszuführen.

4
Hinweis: In Unix / Linux gibt es einen optionalen Befehl mit dem Namen "Rename". Bei einer schnellen Google-Suche gibt es viele ähnliche Befehle für Mac. Ich denke, Sie sollten diese Befehle überprüfen. Diese "Umbenennen" -Befehle verwenden ** sed ** -Ausdrücke (Regex + andere), um den endgültigen Namen zu erstellen. Giacomo Catenazzi vor 8 Jahren 0
Gibt es eine Möglichkeit, dies zu tun, um Unterordner zu machen? Ich versuche auch, den Dateinamen auf 30 Zeichen zu reduzieren, wobei die Erweiterung erhalten bleibt. Irgendwelche Ideen? Ich habe folgendes: mv "$ f" "$ / $ dies funktioniert großartig, entfernt jedoch die Erweiterung, die ich brauche, da die Dateien an ein Windows-System übertragen werden. Tim Moseley vor 8 Jahren 0
Ich würde etwas wie '* (\. [^.] *)? $' Als Regex tun. Mit rename oder mit "find | sed | bash" konstruiere ich den Befehl mv in sed Giacomo Catenazzi vor 8 Jahren 1

1 Antwort auf die Frage

0
Ziggy Crueltyfree Zeitgeister

Sie können verwenden find. Die Optionen in OSX / Darwin findunterscheiden sich geringfügig von denen in anderen * nix-Varianten. Einige dieser Funktionen sind möglicherweise nicht für Sie verfügbar, aber Sie können sich mit den verfügbaren Optionen vertraut machen:

find -regextype posix-extended -regex '.*\/[^\/]*[[:cntrl:]\\:*?"<>|].*' -print \ -exec mv "{}" "$(echo "{}" | perl -ane 'chomp; s/[[:cntrl:]\\:*?"<>|]//g; print' -)"