Danke, dass der alte Thread noch vorgehalten wird. Er hat mir gerade geholfen.
Bei mir hat es durch den Datei-Transfer zwischen verschiedenen Android-Telefonen, einer SMB-Freigabe einer Synology-NAS und Ubuntu Linux diverse Konflikte wegen Sonderzeichen in Dateinamen gegeben. Vor allem Fragezeichen (wegen ursprünglicher Umlaute) und Doppelpunkte in Dateinamen führten dazu, dass ich mit cp, rsync und anderen Programmen nicht mehr zu vernünftigen Resultaten bei Backups und allgemeiner Dateiorganisation komme (stets wird nicht alles kopiert, synchronisiert, brechen Prozesse ab usw. usf.).
Dank dieses Threads, konnte ich meine Dateinamensituation wie folgt verbessern:
Erstmal die fraglichen Dateien in ein Testverzeichnis kopieren:
| find /home/konto/produktiv/ -type f -regextype posix-extended -regex ".*(\||\\|\/|\?|\"|\:|\*|<|>|\w\.$).*" -exec cp {} /home/konto/testch/ \;
|
Mit Verzeichnisnamen habe ich keine Probleme, darum nur Dateinamen: "-type f".
Den Vorgang habe ich nach einer Weile abgebrochen. Da waren 390 Dateien im Testverzeichnis angekommen, was mir zum Testen gereicht hat.
Die Grundgesamtheit der zu untersuchenden Dateien ist viel größer:
Bei mir gibt find Folgendes aus:
find /home/konto/produktiv | wc -l
2056292
Also: Über 2millionen Dateien im Produktivverzeichnis.
Das bedeutet, dass hier mit krename und anderen tollen GUI-Programmen nichts mehr zu machen und die Shell die einzige Option ist.
Dann im Testverzeichnis wieder alle fraglichen Dateien suchen (letztlich alle von dort) und gezielt einzelne Zeichen durch eine für mich aussagekräftige Zeichenkette ([dpp] für Doppelpunkt, [uml] für Fragezeichen) ersetzen, wobei ich für jedes fragliche Zeichen einen gesonderten Lauf mache, um die Übersicht zu behalten; hier einer der Läufe:
| find /home/konto/testch/ -type f -regextype posix-extended -regex ".*(\||\\|\/|\?|\"|\:|\*|<|>|\w\.$).*" -exec rename -n 's/\:/[dpp]/g' {} \;
|
Das Gleiche habe ich anschließend mit "rename -v" ... anstelle "rename -n" ... wiederholt.
Danach der reale Einsatz, bei dem auf das produktive Verzeichnis anstelle des Testverzeichnisses abgestellt wird und der rename-Befehl nicht mit "-n" (= simuliere nur) sondern mit "-v" angegeben wird:
| find /home/konto/produktiv/ -type f -regextype posix-extended -regex ".*(\||\\|\/|\?|\"|\:|\*|<|>|\w\.$).*" -exec rename -v 's/\:/[dpp]/g' {} \;
|
Und so weiter.
| find /home/konto/produktiv/ -type f -regextype posix-extended -regex ".*(\||\\|\/|\?|\"|\:|\*|<|>|\w\.$).*" -exec rename -v 's/\?/[uml]/g' {} \;
|
Das ist keine Musterlösung für erfahrene Shell-Nutzer (da überflüssige Einzelschritte), aber eine m.E. sichere Herangehensweise für nicht 100%ig shellfeste Anwender, die das Problem inkompatibler Dateinamen über eine Shell lösen wollen oder wie ich müssen.