1.5. Ricerca sui file: find, locate, grep

1.5.1. find

Per poter individuare un file presente in qualche dispositivo di memorizzazione (sia floppy disk, hard disk, CD-ROM, etc) senza conoscere adeguatamente il percorso si possono impiegare diversi strumenti a propria scelta; il comando comunque base è find (trova). Questa è una sintassi semplificata su come si possono richiedere le sue funzioni:

find [percorso...] -iname modello

[percorso...] significa che è possibile inserire un singolo o più indicazioni di percorsi, di punti da cui fare partire la ricerca. Se si mettesse / allora cercherà ovunque, in tutti i dispositivi attivi. Si può iniziare con / e aggiungere directory per delimitare solo in alcune zone la ricerca. Oppure può essere un parametro non indicato (nella sintassi è fra parentesi quadre, cioè parametro opzionale), in questo modo la ricerca verrà limitata alla directory corrente.

# find /usr/X11R6/ /home/ -iname .fvwm2rc

Per modello intende i caratteri che compongono la parola da cercare, con la possibilità di usare caratteri speciali come l'asterisco (*), facilitazione che permette di tralasciare di specificare ogni carattere dei file a cui si sta puntando.

Ad esempio nel caso si dovesse individuare la posizione del documento Sound-HOWTO, in un formato qualsiasi, si ignora se sia nel proprio hard disk oppure nel CD-ROM inserito, si potrebbe impostare la ricerca come nell'Esempio 1-4.

Esempio 1-4. find, ricerca di file con modelli

find /usr/doc/ /cdrom/linux/ -iname sound-howto*

Nell'Esempio 1-5 find troverà le occorrenze pj98* e pj99*, ossia tutti i numeri relativi all'anno 1999 e 1998 di una rivista. Sono utilizzati i caratteri speciali [ e ], che identificano l'elenco dei caratteri che possono essere presenti in una sola posizione in un modello (pattern). Per una spiegazione estesa su questo tipo di caratteri speciali si rimanda al capitolo Modelli di occorrenza (o pattern matching).

Esempio 1-5. find, ricerca di file con modelli

find /usr/doc -iname pj9[89]*

1.5.2. locate

locate (localizza) è un programma che dà la possibilità di svolgere una ricerca di file come find ma con velocità molto diversa. La differenza è nel fatto che locate basa la sua ricerca su un elenco dei file presenti raccolto in precedenza, non va direttamente a vedere cosa si trova nei percorsi indicati, con un risparmio di tempo incomparabile.

Per un conveniente uso, comunque, bisogna avere aggiornato questo elenco dei file. Il sistema operativo può essere configurato per farlo in maniera automatica entro un periodo di tempo (ad esempio ogni settimana, ogni tre giorni). Se l'impostazione predefinita della propria distribuzione non è efficiente, può essere fatto manualmente tramite il il comando updatedb.

L'uso di locate è però diverso da find nell'impostare lo schema di ricerca dato che non fa riferimento solo sui nomi di file ma su tutto il percorso, inoltre nei casi più semplici non è necessario porre asterischi.

# locate bzip2
/usr/bin/bzip2
/usr/bin/bzip2recover
/usr/man/man1/bzip2.1.gz

Per specificare di ignorare le differenze fra caratteri maiuscoli e minuscoli si può usare l'opzione --ignore-case (o, abbreviato, -i). Nell'esempio si cercherà per directory e nomi di file che iniziano con Bzip e bzip, l'opzione ha permesso che vengano scovati documenti come Bzip2.html, altrimenti ignorati.

# locate -i */bzip*
/usr/bin/bzip2
/usr/bin/bzip2recover
/usr/doc/ildp/HOWTO/mini/Bzip2.html
/usr/doc/ldp/howto/html/mini/Bzip2-1.html
[...]
/usr/doc/bzip
/usr/doc/bzip/LICENSE
/usr/doc/bzip/manual_1.html
/usr/doc/bzip/manual_2.html
[...]
/usr/doc/bzip/manual_toc.html
/usr/doc/bzip/README

1.5.3. grep

grep (global regular expression printer; visualizzatore di espressioni regolari globali) è uno stimato programma che permette di compiere una ricerca all'interno dei file evitando di visualizzare tutto il contenuto. Mostrerà ogni riga che contiene parole che rispettano il modello (pattern) che viene indicato. Opzionalmente si può ottenere la visualizzazione insieme alla riga con il modello, di una o più adiacenti ad essa.

La sintassi essenziale proposta è questa:

grep [-i] [-r] modello file...

programma | grep [-i] [-r] modello

Esempio 1-6. grep, ricerca di una parola e selezione di file tramite carattere speciale

/usr/doc/programmi/xf86 # grep -r dpms ./
./README.apm:"standby", "suspend" and "off" modes (set with the "xset dpms" command).

L'Esempio 1-6 mostrerà solo la riga in cui è presente la parola "dpms" e indicherà i nomi dei file che contengono la relativa occorrenza fra tutti quelli presenti a partire dalla directory corrente (indicata con ./).

L'informazione che si cercava, qualche indicazione su come impostare le modalità a basso consumo del monitor (le specifiche DPMS), in tal caso sono subito fornite perché insieme al file README.apm, che la contiene, viene indicata proprio la riga che fornisce il comando base impiegabile allo scopo (xset).

L'opzione -r, o, estensivamente --recursive, dice a grep di addentrarsi nelle eventuali directory che incontra nel percorso di ricerca.

È utile sapere come fare ignorare le differenze fra maiuscole e minuscole, questo lo si ottiene con l'aggiunta dell'opzione -i (o --ignore-case), carattere la i che vale tra l'altro anche per -iname di find.

Nel successivo esempio si visualizzano parti del riepilogo delle opzioni di grep, solo le righe in cui è presente la parola righe risulteranno.

# grep --help | grep righe
  -x, --line-regexp         forza MODELLO a corrispondere solo a righe intere
  -v, --invert-match        seleziona le righe che non corrispondono
  -b, --byte-offset         stampa l'offset del byte con le righe di output
  -n, --line-number         stampa il numero della riga con le righe di output
  -c, --count               stampa solo il conto delle righe occorrenti in ogni FILE
  -B, --before-context=NUM  stampa NUM righe di contesto precedente
  -A, --after-context=NUM   stampa NUM righe di contesto seguente
  -C, --context[=NUM]       stampa NUM righe (2 predefinite) di contesto

Per le informazioni sulle regole circa la definizione dei modelli si rimanda al Capitolo 2.

Fra le varianti del comando si segnalano zgrep, una estensione che è in grado di cercare all'interno di file compressi che hanno estensione .gz o .Z, bzgrep per i file compressi con bzip2, zipgrep per i file compressi .zip.

1.5.4. Programmi alternativi all'uso di grep e find

Midnight Commander

Home page:
Requisiti: Nessuno, o X-Window in versione gmc; (Mouse opzionale, con [F9] si accede al menu via tastiera)

Molto diffuso gestore di file (file manager). Per avere un interfaccia più diretta nell'uso, è presente la funzione trova file (find file) del menu File; parametri disponibili: file per la ricerca, contenuto dei file, punto di partenza. Midnight Commander si può richiedere con mc oppure gmc su X-Window con GNOME.

kfind

Home page:
Requisiti: X-Window, KDE

Dedicato alla ricerca. In più del precedente offre una scheda con dei parametri per delimitazioni temporali. Può salvare i risultati in formato testo.

tkdesk

Home page:
Requisiti: X-Window, Tcl/Tk

Rinomato gestore di file, la funzione di ricerca presente è ancora più completa dei programmi precedenti.

Gnome Search Tool

Home page:
Requisiti: X-Window, GNOME

Una applicazione dedicata alla ricerca. Permette di limitare la ricerca con infiniti parametri di diverso tipo. Via shell si richiede con gsearchtool.

Figura 1-1. Gnome Search Tool

tkworld

Home page: http://www.phys.ksu.edu/bailey/tkWorld.html
Requisiti: Requisiti: X-Window, Tcl/Tk 8.0

Si tratta di un programma che intercede per mezzo di una interfaccia grafica ad alcuni tipici comandi Unix, i moduli find, grep e gli altri oltre a facilitarne l'utilizzano possono essere utili per apprendere l'uso di alcuni comandi comuni e il loro possibile coinvolgimento reciproco senza ricorrere all'intermediazione.

Figura 1-2. TkWorld, su uno spaccato di X-Window

Figura 1-3. TkWorld, finestra per grep

[note a margine. considerabili: rexgrep, kgrep, gtkfind]