[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: Dateinamen mit Leerzeichen in Shripten



Hallo Adalbert,

Adalbert Dawid <dawid@rinux.net> writes:

> Preisfrage: was stimmt nicht am folgenden Konstrukt?
>
> #!/bin/bash
> find /bin | while read FILE; do
> 	echo "Datei ${FILE} existiert."
> 	read -p "Löschen? (y/n)" -n 1 REPLY
> 	if [ ${REPLY} = "y" ]; then rm -f ${FILE}; fi
> done
>
> Das Skript ist zwar sinnlos, aber es soll nur mein Problem verdeutlichen:
> Das read innerhalb der Schleife "funktioniert nicht". Hat jemand eine
> Erklärung? Dieses kleine aber überaus nervige Problem taucht übrigens auch
> in der folgenden Minimalkonfiguration auf:
>
> find /bin | while read FILE; do read REPLY; done
>
> Auch hier wird REPLY nie von read abgefragt!

Doch, wird es. Das Dumme ist nur, dass die Eingabe umgeleitet ist und read
aus der Ausgabe von find liest, siehe bash(1):

   Pipelines
   [...]
	Each command in a pipeline is executed as a separate process
        (i.e., in a subshell).

Die ganze while-Schleife ist hier ein Befehl.

> Das Konstrukt
>
> for FILE in `find /bin`; do read REPLY; done
>
> würde zwar prinzipiell gehen, ich brauche aber die Variante mit while,
> weil nur diese imstande ist Dateinamen mit Leerzeichen im Namen korrekt zu
> verarbeiten. Das for zerlegt jeden Dateinamem mit Leerzeichen in mehrere
> Tokens, das while trennt immer nur an Zeilenumbrüchen. 

Warum geht find -exec oder Ähnliches nicht? Was willst du erreichen?

> Danke für eure Anregungen!
>
> -- 
> Grüße
> Adalbert Dawid

Grüße zurück,
Sven



Reply to: