Newsgroup: it.comp.os.linux.iniziare
Titolo: Eseguire un comando in ogni subdir

Ho la necessita' di eseguire un comando (un semplice rm *small.jpg) in 
ogni subdir di una directory. Ho provato a dare l'opzione -r ma non 
funziona... cosa dovrei usare? pensavo ad un ciclo for, ma non sono 
molto pratico e i miei tentativi in merito sono ugualmente fallito...
ale


Non ti conviene utilizzare find invece?
ad esempio nel modo
$ find . -name "*small.jpg" -type f -exec rm {} \;
lanciandolo dalla directory genitore.
Find trova tutti i file (-type f) della dir corrente e delle sue subdir
(.) con nome "*small.jpg" (-name) e per ciascun file esegue il comando
rm <nomefile>
Se i files si possono chiamare anche *SMALL.jpg o *small.JPG puoi
utilizzare la chiavae -iname (versione case insensitive) al posto della
chiave -name
Comunque per maggiori dettagli guarda man find
PSK

 ogni subdir di una directory.
se non hai sotto sotto directory, dai
rm */*small.jpg
o se hai un num di livelli prefissati
rm */*/*small.jpg
o combinate
rm *small.jpg */*small.jpg */*/*small.jpg */*/*/*small.jpg
oltre, ovviamente, al metodo della find che ti hanno già consigliato.
Matteo

On 27 Dic, 22:39, Ale_B

rm -r  "*.jpg"
Cosi' interpreta il carattere jolly come vuoi tu...

 $ find . -name "*small.jpg" -type f -exec rm {} \;
perfetto, funziona! Grazie mille!
Ho dato un'occhiata al comando find come mi hai consigliato, e sebbene 
mi spaventi un po' mi sembra ben potente!
Ora dovrei fare un'altra cosa un po' diversa...
Praticamente sostituire l'occorrenza "*_?.*" con "*_0?.*" (da leggersi, 
in italiano: "dove in un file ad un certo punto tra un underscore e un 
punto c'e' un solo carattere, prima di quel carattere mettici uno zero").
Il problema, sia con mv che con find, e' che non riesco a dargli 
l'output giusto, nel senso che non posso dirgli "guarda com'era il nome 
del file e aggiungici uno zero...".
Googolando ho letto di espressioni regolari, ma non capisco ne' se si 
possano usare all'interno di mv, find, for ecc ne' se sono 
effettivamente quello che sto cercando.
Sono proprio fuori strada?
Grazie!
ale

Matteo Rossini ha scritto:

Ecco, a questo non avevo proprio mai pensato (ad usare l'asterisco prima 
di uno slash, intendo). Grazie per il tip! ^_^
ale

 ale
Ave o Maria (prego) :-P
Luca

 
Ho giochicchiato un po', arrivando a qualcosa tipo questo:
ls|sed 's/\(.*-\)\(._.*)/\10\2'
(considerando solo i file della dir corrente, poi la parte prima della 
pipe la cambio con un find o con un ls -r * o bho (??))
Praticamente, se ho capito bene, s/ e' per sostituire, poi in \( \) 
delimito le due parti di nome, che poi dopo lo slash richiamo come \1 e 
\2 e in mezzo ci metto lo zero che voglio aggiungere...
A guardarla mi da' molta soddisfazione, visto che non ho mai scritto una 
fila di caratteri cosi' strani che /vorrebbero/ avere un senso, ma come 
output mi dice:
sed: espressione -e #1, carattere 22: comando `s' non terminato
ho provato a modificare qualcosina, tipo togliere o modificare le 
virgolette (singole-doppie), ma nisba... qualche indizio su dove 
sbaglio??... ^^'
merci!
Alessandro ;

 ls|sed 's/\(.*-\)\(._.*)/\10\2'
Ti manca il carattere che delimita la regex ed un backslash che faccia
l'escape della seconda parentesi del secondo gruppo:
s/\(.*-\)\(._.*)/\10\2/
               ^      ^
Un consiglio: quando ci sono così tanti slash / backslash da potersi
confondere, puoi usare altri caratteri, come "@":
s@\(.*-\)\(._.*\)@\10\2@
Ciao,
David
-- 
 . ''`.  Debian maintainer |  
http://snipurl.com/qa_page
 : :'  :  Linuxer #334216  |  
http://www.hanskalabs.net/
 `. `'`    GPG: 1392B174   | 
http://www.debianizzati.org/
   `-   2BAB C625 4E66 E7B8 450A C3E1 E6AA 9017 1392 B174

 
Grazie dei consigli e delle correzioni!
Effettivamente ora non da' nessun errore, ma non fa quello che dovrebbe 
fare!... Il pattern mi sembrava giusto per far diventare
C+VG-1_1.jpg --> C+VG-01_1.jpg
(oppure, accorgendomi di un errore concettuale mio iniziale,
  s@\(.*-.*_\)\(.\.\)@\10\2@ per far diventare
C+VG-1_1.jpg --> C+VG-1_01.jpg,
che mi interessa di piu'...
Dovrebbe rinominarlo? Esiste un sistema per fare un "debug" di quello 
che fa sed?
Ciao, e ancora grazie!
Alessandro

 che fa sed?
Non credo :(. Ma può anche darsi che qualcuno mi smentisca.


 
L'ho modificata cosi':
#!/bin/bash
dir='/home/foo/mia/directory/'
IFS="
"
for i in $(find $dir -type f)
do
	mv "$i" $(echo "$i" | sed 's@\(.*-.*\)_\(..\..*\)@\10\2@')
done
in pratica aggiungendo l'IFS per i nomi con spazi, e le virgolette 
attorno anche all'$i dentro le parentesi.
Cosi' funziona perfettamente, ancora grazie!!
Ciao
Alessandro