Am Donnerstag, 14. Oktober 2004 17:29 schrieb Dr. Jürgen Vollmer:
On Thursday 14 October 2004 15:17, Dirk Meier wrote:
Hallo, ich versuche mit: find . -name *ä* -exec mv -v {} `echo {} | sed 's/ä/ae/'` \; Dateien mit Umlauten umzubenennen. Als Ergebnis obigen Befehls erhalte ich: "./testä und ./testä sind die gleiche Datei". Es sieht so aus, dass die Kommandosubstitution nich funktioniert. Aber warum nicht? Dirk
ein set +x vor der Ausfühung des Kommandos gibt den Grund daf+ür an: ------ ++ echo '{}' ++ sed s/ä/ae/g + find . -name testä -exec echo mv -v '{}' '{}' ';' mv -v ./testä ./testä ------
das `echo {} | sed 's/ä/ae/'` wird natürlich ausgewertet, _bevor_ das find-exec ausgeführt wird. Ist ja auch klar, denn es steht ja auch da: find ... `echo...` `..` wird zuerst ausgewertet, bevor das Kommando ausgeführt wird.
Wenn man das machen will dann doch einfacher (und allgemeiner):
for f in `find $DIR -regex ".*[äöüAÖÜ].*"` do mv $f `echo $f | sed -e"s/ä/ae/g" -e"s/ö/oe/g" -e"s/ü/ue/g" \ -e"s/Ä/Ae/g" -e"s/Ö/Oe/g" -e"s/Ü/Ue/g"` done
Jürgen
------- Hallo Jürgen, das ist eine schöne Lösung und funktioniert einwandfrei. Leider ist bei der Ausführung ein weiteres Problem aufgetaucht. Es existieren auch Dateinamen, die Leerzeichen enthalten. for f in `find $DIR -regex ".* .*"` do mv $f `echo $f | sed -e"s/ /_/g"` done funktioniert nicht, da mv die Dateinamen mit Leerzeichen als mehrere Dateinamen interpretiert. Gibt es da auch eine einfache Lösung? Außerdem habe ich den ersten Teil mit set +x nicht verstanden. Kannst Du dass bitte erläutern. Was verbirgt sich hinter der Variablen $DIR? Ein echo $DIR liefert eine leere Ausgabe, aber eingebaut in find funktioniert es. Dirk