sabato 20 novembre 2010

Cercare file e cartelle con locate!

Per la ricerca di file e cartelle sul file system del nostro sistema operativo GNU/Linux disponiamo solitamente di più comandi. Uno di questi è il comando locate che, come è riportato nella pagina del manuale in linea, effettua una ricerca basandosi sul nome passato al comando come argomento (tale parametro può anche rappresentare un'espressione regolare - in tal caso la stringa va preceduta dall'opzione --regex). La sintassi da usare è la seguente: locate PATTERN.
L'output generato dal comando prevede una voce per ogni nome di file o cartella che corrisponde al PATTERN passato al comando (il comando ritorna il path assoluto al file). Lo stesso pattern può essere interpretato dal comando come base per tutti i possibili nomi che con esso si possono formare, in tal caso occorre passare al comando l'opzione -b (base name). Pertanto, il comando locate -b PATTERN trova tutti i file il cui nome coincide con PATTERN (se esiste trova, ad esempio, anche il file PATTERNS). Se il nome passato al comando va invece cercato per intero, così com'è, senza indagare su possibili varianti, occorre allora passare al comando l'opzione -w (wholename). Quindi, il comando locate -w PATTERN trova tutti i file il cui nome è PATTERN. Se siamo interessati al conteggio dei file trovati l'opzione da usare è -c (count), mentre -i (ignore case) trascura i caratteri scritti in maiuscolo e/o minuscolo nel pattern. Che ne dite di provare?


Mmm... sembra non funzionare. Pur avendo appena creato quei file! In verità il comando locate non si mette a ispezionare tutto il disco alla ricerca dei file! La ricerca viene condotta su un database locale che raccoglie i nomi di file e cartelle. In questo modo la ricerca non tiene impegnato l'hard disk per il tempo che solitamente siamo abituati ad aspettare. La ricerca con locate è davvero veloce. In questo caso però quei file non sembrano esistere. Com'è possibile?
La risposta è davvero molto semplice. Se il comando cerca il pattern in un database è evidente che quest'ultimo, dopo la creazione di nuovi file, non risulta allineato effettivamente al nostro file system. Bisogna aggiornare il database dei nomi. Come? Con il comando sudo updatedb (eseguibile solo da root). Ecco allora il secondo tentativo:


Dopo aver aggiornato il database dei nomi la ricerca con locate torna effettivamente il path dei file cercati! Il problema, adesso, sembra essere un altro. Il file new_file2.txt, pur essendo stato cancellato (osservate i comandi nell'immagine) continua ad essere mostrato nell'output di locate! Anche in questo caso il database dei nomi non era aggiornato. Pertanto, meglio aggiornarlo prima di ogni ricerca con updatedb.
Possiamo tuttavia istruire il comando locate alla verifica dei file che trova nel database. Basta passare l'opzione -e (existing), verranno mostrati i file ancora esistenti sul file system:


La ricerca effettuata con locate ritorna solo i file accessibili all'utente che invoca il comando. Pertanto, se un file non risulta essere presente, pur avendo aggiornato il database dei nomi, non dimenticate di provare la stessa ricerca con i privilegi del super utente.
Come dicevo poco fa il comando locate è veloce. Considerate, tuttavia, prima di ogni ricerca, il tempo necessario al vostro hardware per aggiornare il database dei nomi! Quanto mi costa tutto questo in termini di spazio sull'hard disk? Direi poco. La dimensione in byte del database dei nomi può essere vista con il comando locate -S (stats):


Nel mio caso, 3910909 bytes. Ovvero, circa 3.72 MB, nemmeno troppi.

Nessun commento:

Posta un commento