Keywords: guide

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: tar, l'archiviatore a nastro Up: find, per cercare i Previous: Esempi