next up previous contents index
Next: tar, l'archiviatore a nastro Up: find, per cercare i Previous: Esempi

Un'ultima parola

Tenete a mente che find è un comando che prende moltissimo tempo, dato che deve accedere a tutti gli inode del sistema per operare. È quindi saggio combinare tutte le operazioni che vi servono in un'unica invocazione di find, specialmente nei lavori di `pulizia' fatti da crontab. Un esempio illuminante è questo: supponiamo di voler cancellare i file che finiscono con .BAK e cambiare le protezioni di tutte le directory a 771 e quelle dei file che finiscono con .sh a 755. E magari stiamo montando dei filesystem via NFS su un collegamento via modem, e non vogliamo controllare quei file. Perché scrivere tre comandi separati? Il modo più efficace di portare a termine il compito è questo:

 % find . \( -fstype nfs -prune \) -o \
          \( -type d       -a -exec chmod 771 {} \; \) -o \
          \( -name "*.BAK" -a -exec /bin/rm {}   \; \) -o \
          \( -name "*.sh"  -a -exec chmod 755 {} \; \)
 

Sembra brutto (e che spreco di barre rovesciate!), ma guardando attentamente rivela che la logica che c'è sotto è molto lineare. Ricordate che quello che fa in realtà è una valutazione vero/falso; il comando compreso è solo un effetto secondario. Ma ciò significa che viene fatto solo se find deve valutare la parte exec dell'espressione, cioè solo se il lato sinistro della sottoespressione rende vero. Quindi, se per esempio il file considerato al momento è una directory viene valutato il primo exec ed i permessi dell'inode vengono cambiati a 771; altrimenti se ne dimentica e passa alla seconda sottoespressione. Probabilmente è più semplice vederlo in pratica che scriverlo, ma dopo un po' diventerà una cosa naturale.


next up previous contents index
Next: tar, l'archiviatore a nastro Up: find, per cercare i Previous: Esempi
Eugenia Franzoni
1998-09-29