PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Bash-Script Fehler



LinuxFanBoy
16.07.15, 09:01
Liebe Linux-Community,

Ein Hallo aus der Schweiz! Ich bin neu hier obwohl ich schon des Öfteren hier einige Beiträge mitgelesen habe :-)

Heute habe ich ein Problem mit einem kleinen Script, welches ich geschrieben habe und zwar versuche ich sämtliche Sonderzeichen in Dateien zu ersetzen.
Das Script geht ab einem root-Pfad rekursive in die Unterordner und sucht auch hier nach Dateien.

find /var/www/html/dokumente/* -type f -name "*[äöüÄÖÜ]*" -exec rename 's/ä/ae/g;s/ö/oe/g;s/ü/ue/g;s/Ü/UE/g;s/Ä/AE/g;s/Ö/OE/g' {} \;

Nun habe ich das Problem, dass ich Files habe, welche ungefähr so aussehen "Dokument 1 Über die Ansicht (d).doc" -> Hier wirft er mir nun eine Fehlermeldung:


Can't rename /var/www/html/dokumente/Dokument 1 Über die Ansicht (d).doc /var/www/html/dokumente/Dokument 1 Über die Ansicht (d).doc: Datei oder Verzeichnis nicht gefunden


Für mich sieht es danach aus, als ob die Leerzeichen und die "( )" Probleme machen. Vermutlich muss ich der Shell irgendwie mitteilen, dass die Pfade unter "" zu sehen sind.
Leider komme ich nicht weiter.

Danke für eure Hilfen :)

Efraim
16.07.15, 09:43
Durch das Sternchen nach dokumente/* lässt Du die Shell mitarbeiten. Dieses Sternchen solltest Du weg lassen, damit find die Namen alleine auflöst.

LinuxFanBoy
16.07.15, 10:28
Vielen Dank euch Beiden - wieder etwas gelernt :)

Funktioniert nun einwandfrei.

BetterWorld
16.07.15, 12:21
Der Vollständigkeit halber sei noch der wichtige Schalter -print0 erwähnt.

Da per Definitionem ein Dateiname jedes Zeichen außer der binären Null ( \0 ) und dem Slash / enthalten kann, gibt es diese "Aktion".

Aus der manpage:
print the full file name on the standard output, followed by a null character (instead of the newline character that -print uses). This allows file names that contain newlines or other types of white space to be correctly interpreted by programs that process the find output. This option corresponds to the -0 option of xargs.


(Ggf. wäre noch IFS=$'\0' zu verwenden)

Generell ist das Quoting bei der Shellprogrammierung wohl das Wichtigste.
Lest das und quoted künftig korrekt&fleißig. (http://www.grymoire.com/Unix/Quote.html) Spart viel, viel Ärger.

Was auch ganz nützlich ist, ist die Function:

printf %q $SomeStringDiese Funktion quoted jedes Metazeichen.

Efraim
16.07.15, 20:58
Du liegst falsch, nopes. Die Anführungszeichen werden schon von der Bash substituiert und kommen nicht bei find an und schon gar nicht bei rename.

BetterWorld
16.07.15, 21:19
Korrekt.
Man könnte \" probieren.
Hab ich noch nie gemacht.

Braucht es auch nicht. Siehe oben.

Efraim
16.07.15, 22:02
Man könnte \" probieren.
Hab ich noch nie gemacht.
Ergibt eine Fehlerorgie:

find -exec ls \"{}\" \;

nopes
16.07.15, 22:03
Du liegst falsch, nopes. Die Anführungszeichen werden schon von der Bash substituiert und kommen nicht bei find an und schon gar nicht bei rename.
Stimmt hast recht, gerade mal selber probiert
nopes@debdev2:~/proggen/foo/bar$ touch 'übler name.txt'
nopes@debdev2:~/proggen/foo/bar$ touch 'noch üblerer name (2).txt'
nopes@debdev2:~/proggen/foo/bar$ find . -type f -exec rename 's/ü/ue/g' {} \;
nopes@debdev2:~/proggen/foo/bar$ ll
-rw-r--r-- 1 nopes nopes 0 Jul 16 22:54 noch ueblerer name (2).txt
-rw-r--r-- 1 nopes nopes 0 Jul 16 22:53 uebler name.txtRennt auch mit den Quotes, komisch, dass das gewirkt hat bzw. vermutlich wohl gewirkt haben soll...

BetterWorld
16.07.15, 23:00
hehehehe

mir reicht das -print0

Efraim
17.07.15, 10:32
komisch, dass das gewirkt hat bzw. vermutlich wohl gewirkt haben soll...
Ich gehe davon aus, dass das Sternchen der Fehler war. Das wird von der Bash gegen eine Datei- und Ordnerliste ersetzt, die dann von find abgearbeitet wird. Dabei könnten Dateien mehrfach gefunden werden, was rename natürlich nicht lustig findet.