Newsgroup: it.comp.os.linux.iniziare
Titolo: bash, cicli for e spazi nei nomi dei file

salve
ho un problema che non so risolvere. mi capita spesso di avere un
elenco di file
su cui dover fare la stessa operazione per ogni elemento dell'elenco.
per questo utilizzo il ciclo for quasi sempre senza problemi tranne nel
caso in cui i nomi dei file contengano spazi. in tal caso la variabile
che utilizzo nel ciclo non prende un valore per ogni file ma uno per
ogni parola. ad esempio:
se i file sono i seguenti:
La_strada.mp3
Macondo_Express.mp3
modena city ramblers - bella ciao.mp3
modena city ramblers - Canzone Dalla Fine Del Mondo.mp3
modena city ramblers - contessa.mp3
modena city ramblers - i funerali di berlinguer.mp3
modena city ramblers - la banda del sogno interrotto.mp3
modena city ramblers - la locomotiva.mp3
modena city ramblers - primo potere.mp3
Ramblers_Blues.mp3
Viva_la_vida.mp3
eseguendo :
for i in $(ls);do echo $i; done
ottengo:
A_gh'e'_chi_g'a'.mp3
La_strada.mp3
Macondo_Express.mp3
modena
city
ramblers
-
bella
ciao.mp3
modena
city
ramblers
-
Canzone
Dalla
Fine
Del
Mondo.mp3
modena
city
ramblers
-
contessa.mp3
modena
city
ramblers
-
i
funerali
di
berlinguer.mp3
modena
city
ramblers
-
la
banda
del
sogno
interrotto.mp3
modena
city
ramblers
-
la
locomotiva.mp3
modena
city
ramblers
-
primo
potere.mp3
Ramblers_Blues.mp3
Viva_la_vida.mp3
e non :
a_strada.mp3
Macondo_Express.mp3
modena city ramblers - bella ciao.mp3
modena city ramblers - Canzone Dalla Fine Del Mondo.mp3
modena city ramblers - contessa.mp3
modena city ramblers - i funerali di berlinguer.mp3
modena city ramblers - la banda del sogno interrotto.mp3
modena city ramblers - la locomotiva.mp3
modena city ramblers - primo potere.mp3
Ramblers_Blues.mp3
Viva_la_vida.mp3
come effettivamente vorrei.
come posso risolvere il problema?
grazie
parser

 come posso risolvere il problema?
for i in *.mp3;do echo "$i"; done

 caso in cui i nomi dei file contengano spazi.
IFS='
'
for el in `ls`; do
    echo $el
done
-- 
Torno subito

 for i in $(ls);do echo $i; done
echo $(ls) | while read i; do echo "$i"; done
Ciao,
-- 
        Roberto Divia`              Love at first sight is one of the greatest
Dep:PH Bat:53 Mailbox:C02110      labour-saving devices the world has ever seen
Route de Meyrin 385               ---------------------------------------------
Case Postale                                Phone:  
+41-22-767-4994
CH-1211 Geneve 23 CERN                      Fax:    
+41-22-767-9585
Switzerland                                 E-Mail: 
Robert...@cern.ch

 echo $(ls) | while read i; do echo "$i"; done
Perche' usi echo?
"echo $(ls)" non e' lo stesso di "ls" ?
 Ciao
 Federico

 IFS=$'\n'
carino, mi mancava! ^_^
vabe', comunque l' espansione tramite asterisco e' anche piu' comoda (anche
se comunque a volte puo' essere necessario l' uso di ls, ad esempio se
serve che i vari file siano ordinati per estensione)
-- 
Torno subito

 Perche' usi echo?
Era per fare un esempio di come usare la variabile i (con i quote, altrimenti
meta` dei comandi si piantano).
La domanda originale era come fare un operazione su una lista di file. Io ho
fatto un echo, avrei potuto fare:
echo $(ls) | while read i; do rm "$i"; done
echo $(ls) | while read i; do cat "$i"; done
Era solo un esempio.


 meta` dei comandi si piantano).
Ciao Roberto,
 c'e' stato un malinteso! Io parlavo del primo "echo", quello prima della
pipe ...
"echo $(ls)" equivale a "ls" ...
 Ciao
 Federico

 "echo $(ls)" equivale a "ls" ...
Aha. Se $(ls) contiene solo il risultato di un "ls", allora l'echo non serve.
Se invece $(ls) contiene l'output di "ls" massaggiato, allora...
Il problema originale mostrava "echo $(ls) | for...". Io ho usato lo stesso
medoto.


 serve. Se invece $(ls) contiene l'output di "ls" massaggiato, allora...
Ciao,
 sbagliavamo entrambi :-)
Io dicevo che [echo $(ls)] equivale a [ls], e questo non e' vero!
[echo "$(ls)"] equivale a [ls]; questo si'! Ma se non quoti la command 
substitution, i newline vengono convertiti in spazi.
Tu proponevi:
echo $(ls) | while read i;
ma questo e' inutile apposta perche' il while leggerebbe tutto su una sola 
riga.
echo "$(ls)" | while read i;
andrebbe meglio.
 Ciao
 Federico


Giusto.
$ touch "a b"
$ touch c
$ touch "d e f"
$ ls | while read i; do echo $i; done
a b
c
d e f
$ ls="`ls`"; echo $ls | while read i; do echo $i; done
a b c d e f
$ ls="`ls`"; echo "$ls" | while read i; do echo $i; done
a b
c
d e f
$ ls="$(ls)"; echo $ls | while read i; do echo $i; done
a b c d e f
$ ls="$(ls)"; echo "$ls" | while read i; do echo $i; done
a b
c
d e f
Un esempio val piu` di 1000 parole.
