Am Sam, 2003-06-28 um 16.01 schrieb Wolfgang Erlenkötter :
Hallo
Wolfgang Erlenkötter schrieb:
Hallo Liste,
ich teste gerade ein Skript und verstehe nicht, warum es nicht so funktioniert, wie es sollte:
Mit find . -type f -maxdepth 1 -print|sed 's/ /\\ /g' auf der Kommandozeile erhalte ich:
./KARL ./karl ./paul ./ott.sh ./Diese\ Datei ./teste.tar
(Die Dateien im aktuellen Verzeichnis) Das heißt, die Leerstelle in dem Dateinamen Diese Datei soll geschützt werden.
Baue ich das ganze in ein Skript:
for FILE in `find . -type f -maxdepth 1 -print|sed 's/ /\\ /g'`; do
Der Teil zwischen den '`' wird ersetzt durch einen String "... ./otto.sh ./Diese Datei ./teste.tar" . Der Backslash verschwindet irgendwo zwischen dem find und Deinem Script, da hier eine Shell-Schnittstelle liegt. Problem mit sub-shell, genau das, was ich an bash so hasse.
echo -n "File: $FILE -> " if [ -e $FILE ]; then echo -e "\033[32mOK\033[m" else echo -e "\033[31mERROR\033[m" fi done
geht das schief?
Meine Frage: 1) Warum geht es schief? 2) Wie mache ich das besser?
Also. Hier die unterschiedlichen Ausgaben: wolfgang@pio:~/leer> find . -type f -maxdepth 1 -print|sed 's/ /\\ /g' ./KARL ./karl ./paul ./ott.sh ./Diese\ Datei ./teste.tar
und:
./ott.sh (so heißt das Skript) File: ./KARL -> OK File: ./find -> OK File: ./karl -> OK File: ./paul -> OK File: ./ott.sh -> OK File: ./Diese -> ERROR File: Datei -> ERROR File: ./teste.tar -> OK
Im zweiten Beispiel wird die Leerstelle als Trennzeichen benutzt!
Abhilfe AFAIK: 1. find ein \0 an die Dateinamen anhängen lassen (man find); oder: 2. Die Auswertung (echo, if ....fi) in ein extra-Script einbauen und im find-Befehl die Option -exec benutzen. Man könnte im Prinzip auch eine bash-function benutzen, aber ich glaube nicht, dass das über den find-befehl geht. HTH, Wolfgang