Newsgroup: it.comp.os.linux.sys
Titolo: Eseguire comando condizionale su più file

Salve a tutti.
Avrei bisogno di fare uno script bash che faccia quanto segue:
1. ottiene un elenco di file (cercandoli con find in base a una 
caratteristica del nome);
2. controlla una condizione sul file (in particolare il risultato di un 
getfattr), e in base al risultato...
3. ...esegue un comando sul file (lo cancella).
Il problema è che find non permette di fare controlli sugli extended 
attributes, altrimenti la cosa sarebbe immediata, in una sola riga.
Invece mi tocca creare prima la lista di file con find, e poi fare il 
controllo e l'eventuale cancellazione.
Qual è il modo migliore per farlo, in bash?
Fare controllo e cancellazione con un secondo script, lanciato dal primo 
per ogni risultato di find? Non mi piace molto...
Creare un array con i risultati di find e iterare su di esso? E come 
faccio per i nomi di file che contengono spazi?
Oppure lascio perdere bash e lo faccio in python?
Grazie per eventuali consigli.
-- 
Ciao,
   Marco.

 ...
Ecco, questo e' il modo peggiore.

Marco De Vitis scrisse:

find $directory $criteri di ricerca -print |
  while read  afile
   do
     getfattr "$afile" ...
     if ...
       # do something
     fi
    done  
Nota le virgolette.

 attributes, altrimenti la cosa sarebbe immediata, in una sola riga.
Una roba così non funziona?
find *.dat -exec csh -c 'test "`getfattr --only-values -n user.comment
$1`" = "42" && rm $1'
Y.

 $1`" = "42" && rm $1'
No, non funziona
man find

 for file in `find ...` ; do
Ma resta il problema dei file contenenti uno spazio nel nome, se non 
sbaglio.
Grazie a tutti per l'aiuto. Penso che ora proverò la soluzione suggerita 
da mallin, che mi sembra semplice e funzionante, non conoscevo il 
comando read. Non provo la soluzione di yossarian perché preferisco 
l'altra, ma mi fido sulla parola ;).
-- 
Ciao,
   Marco.

 No, non funziona
Oops, dal copiaeincolla è sfuggito l'ultimo pezzetto:
find *.dat -exec csh -c 'test "`getfattr --only-values -n user.comment
$1`" = "42" && rm $1' {} ';'
A me funziona:
$ touch a.dat
$ touch b.dat
$ touch c.dat
$ setfattr -n user.comment -v '24' a.dat
$ setfattr -n user.comment -v '42' b.dat
$ setfattr -n user.comment -v '84' c.dat
$ find *.dat -exec csh -c 'test "`getfattr --only-values -n user.comment
$1`" = "42" && echo $1' {} ';'
$ ls *.dat
a.dat  c.dat
Y.

 ...
Se avresti scritto:
find . -name '*.dat' ...
forse potevi anche aver avuto ragione.

 sbaglio.
No, Le virgolette attorno al parametro servono proprio 
ad evitare problemi con spazi e tabulazioni.
Il mio spunto per uno script non è perfetto, ha bisogno 
di essere sviluppato e presenta problemi con i nomi dei 
file contenenti interruzioni di riga.

 forse potevi anche aver avuto ragione.
Vabbè, era solo un esempio...

 prima.
No, non basta.
Il problema grave sta nel costrutto for usato con la 
sostituzione dei comandi; e` un costrutto da evitare.
La questione è stata discussa parecchie volte e non 
intendo ritornarvi.

 file contenenti interruzioni di riga.
Sì ho notato leggendo un po' di docs, e devo ancora rifinire qualcosina, 
ma sinceramente dei nomi con interruzioni di riga credo di potermene 
infischiare, trattandosi di directory in cui scrivono solo client Win e 
Mac tramite Samba...
-- 
Ciao,
   Marco.

 "
Uh... interessante!
Allora forse cosě potevo anche usare la mia idea iniziale di memorizzare 
l'output di find in un array e poi ciclare sull'array... ma vabbe', 
ormai ho fatto nell'altro modo.
-- 
Ciao,
   Marco.

 ... (ma non sono un dio  di bash, eh, se non si fosse capito).
In tal caso:
http://tldp.org/LDP/Bash-Beginners-Guide/Bash-Beginners-Guide.pdf

 
http://tldp.org/LDP/Bash-Beginners-Guide/Bash-Beginners-Guide.pdf
Sempre utile, ma comunque finora i miei scriptini me li sono fatti, e se 
non capivo qualcosa non ho avuto problemi a cercare documentazione in 
rete. Stavolta il problema era che non sapevo cosa cercare :).
-- 
Ciao,
   Marco.

 Se avresti scritto:
Si'.


mi sembra l'esame di sisop xD
comunque che è getfattr???

 comunque che è getfattr???
Il comando per leggere gli attributi estesi dei file. Nel mio caso 
dovevo leggere il contenuto dell'attributo user.DOSATTRIB nel quale 
Samba memorizza gli attributi Windows che non hanno corrispondenza su Linux.
-- 
Ciao,
   Marco.