[Linuxtrent] Re: cancellare ricorsivamente file

  • From: Matteo Ianeselli <matteo.ianeselli@xxxxxxxxxxxxxxxx>
  • To: linuxtrent@xxxxxxxxxxxxx
  • Date: Wed, 9 Apr 2003 13:08:29 +0200

Pare che Danilo Spada, in un momento di ispirazione, abbia scritto:
 > Ciao a tutti.
 > 
 > Ma come posso cancellare ricorsivamente tutti i documenti con estensione 
 > .DOC da un'infinita serie di sottocartelle ?

Portabile tra Unix diversi:
    find . -name '*.doc' -o -name '*.DOC' -o -name '*.Doc' -print | xargs rm -f 

GNU only:
    find . -iname '*.doc' -print0 | xargs -0 rm -f 


<spieghino>

Trova a paritre dalla directory corrente (.) i file che, terminano per
.doc e scrivine i nomi su standard output, passandoli quindi a xargs
il quale ne legge una manciata ed esegue il comando indicato come
parametro (rm -f) seguito dalla manciata di nomi.

Ha prestazioni migliori di "find ... -exec rm -f {} \;" perche` in
quest'ultimo caso avvii un "rm -f" per ogni file da cancellare, mentre
con xargs avvii un "rm -f" solo ogni N file (con N piuttosto grande).

L'unico difetto con la soluzione portabile tra Unix e` che i nomi
sparati fuori da find son separati con degli a capo, per cui se il
nome di un file contiene un ritorno a capo (possibile, anche se
improbabile), xargs lo vede come due nomi distinti... e che il find
Unix di per se` non prevede -iname (case insensitive), ma solo -name.

Ovviamente, c'e` la soluzione anche a questo con i tool GNU. "-print0"
fa la stessa cosa di "-print", ma invece che usare un "a capo" per
separare i nomi dei file, usa un byte a zero (che non e` valido nei
nomi dei file). Chiaramente, anche xargs deve essere informato della
cosa (-0).

-- 
 |   \    \  | ___|_  |_  | matteo.ianeselli AT telecomitalia.it
 |  _ \  | \ | _|    /   /  Visita il LinuxTrent a
_|_/  _\_|  _|____|___|___| http://www.linuxtrent.it

-- 
Per iscriversi  (o disiscriversi), basta spedire un  messaggio con SOGGETTO
"subscribe" (o "unsubscribe") a mailto:linuxtrent-request@xxxxxxxxxxxxx


Other related posts: