Moin,
Zitat von
Rogdab
Folgende Fehlermeldung wird ausgespuckt:
sh: Syntax error: "(" unexpected
kannst Du mal einen der Dateinamen hier posten? Normalerweise wird in Single Quotes nichts mehr interpretiert, also passiert es wahrscheinlich, dass irgendeine Kombination von ' und Sonderzeichen auftaucht - damit würde nämlich das Quoting des Dateinamens beendet und der Rest steht "nackt" da.
Das ist ein kleines Problem, weil (man bash):
Enclosing characters in single quotes preserves the literal value of each character within the quotes. A single quote may not occur between single quotes, even when preceded by a backslash.
Wie man sieht, stimmt das:
Code:
jan@jack:~/tmp> echo '123'(456\('
bash: syntax error near unexpected token `('
jan@jack:~/tmp> echo '123\'(456\('
bash: syntax error near unexpected token `('
jan@jack:~/tmp> echo '123'"'"'(456\('
123'(456\(
So, die 3. Variante würde funktionieren - dann probieren wir mal was, wird jetzt allerdings etwas komplizierter. Für die folgende Umsetzung gibt es eine einzige Voraussetzung: In den Dateinamen dürfen keine "|" auftreten, wenn ja, dann musst Du Dir ein anderes Zeichen aussuchen (oder die betreffenden Dateien umbenennen) - ich habe zum Testen mal die Befehlszeile etwas verändert:
Code:
jan@jack:~/tmp/muell_namen> ls -l
insgesamt 0
-rw-r--r-- 1 jan users 0 2008-05-20 19:50 123'(456\(b l a)
-rw-r--r-- 1 jan users 0 2008-05-20 19:50 123'(456\(bla)
-rw-r--r-- 1 jan users 0 2008-05-20 19:58 123 "buh" 456
jan@jack:~/tmp/muell_namen> find . -type f -printf "ls |%p|; echo |%h/folder.jpg|\n" | sed "s/'/|\"'\"|/g;s/|/'/g" | sh
./123'(456\(bla)
./folder.jpg
./123'(456\(b l a)
./folder.jpg
./123 "buh" 456
./folder.jpg
Jetzt schließen wir die Dateinamen erstmal in | ein, damit wir sie anschließend schön quoten können. Die Ausgabe des find wird an einen sed geschickt, der zuerst alle ' durch |"'"| ersetzt und dann die | durch ' - und das sollte dann sauber sein.
Viel Erfolg
Jan
P.S.: In meiner Sammlung habe ich aber vorher mit solchen murksigen Dateinamen aufgeräumt - spart einem anschließend viel Ärger.
EDIT: Der sed geht natürlich auch so, dass man gleich das ' durch '"'"' ersetzt - dann würde man der 2. Ersetzung etwas Arbeit ersparen.
Lesezeichen