24 marzo 2013 - Linux 3.2.0-39-generic -Ubuntu i686 GNU/Linux
Tempo fa ho avuto la necessiatà di usare locate per cercare un file su un disco esterno, mi accorsi subito che con la configurazione di default i dati montati su /media non venivano indicizzate nel database di locate (un file binario, generalmente in /var/lib/mlocate/mlocate.db).
Per ottenerne l'indicizzazione si deve modificare il file di configurazione /etc/updatedb.conf.
Di seguito spiego come fare.
Locate è uno strumento di ricerca già installato su molte distribuzioni, (se non lo avete, installare il pacchetto mlocate).
Locate non è potente come find ma è molto più veloce.
Locate supporta nativamente il globbing (*,? etc) e mediante l'opzione --regex, anche le espressioni regolari.
Lo scopo di locate è di cercare files presenti sul nostro filesystem in base al loro nome (nei path di cui abbiamo almeno il permesso di lettura).
La ricerca è molto veloce perchè viene effettuata su un database contenente i nomi dei file del filesystem (e non sul filesystem stesso, come fa find).
Il database può essere aggiornato manualmente con: sudo updatedb, comunque viene aggiornato automaticamente, ogni giorno, facendo eseguire updatedb da cron.
Di default locate indicizzerebbe tutto quello che discende dalla radice (/) del filesystem; per limitarne la scansione viene utilizzato un file di configurazione testuale: /etc/updatedb.conf.
Il file di configurazione di default, di ubuntu 12.10 dovrebbe essere così:
Tutto quello che compare all'interno dei parametri presenti è escluso dall'indicizzazione, ogni voce inserita deve essere separata dall'altra mediante uno spazio e la stringa completa racchiusa tra virgolette .
PRUNE_BIND_MOUNTSSi può scegliere di escludere qualsiasi device in condivisione, esterno al filesystem, impostando PRUNE_BIND_MOUNTS a "yes" oppure a "1". Se, per esempio, si volesse indicizzare un drive NTF condiviso si dovrebbe porre PRUNE_BIND_MOUNTS a "no" oppure a "0".
PRUNENAMESSi può escludere qualsiasi nome di file dall'indicizzazione inserendolo in PRUNENAMES.
Nel file di configurazione, visto sopra, ci sono alcune estensioni di files ed il parametro non è attivo perché commentato (mediante il carattere '#' posto ad inizio riga);
per abilitarlo cancellare il carattere '#'; in questo modo, qualsiasi file (ovunque si trovi), con estensione uguale a quelle elencate nel parametro, non sarà indicizzato; lo stesso discorso vale anche per i nomi di directories, naturalmente non si deve inserire il percorso assoluto.
Si può escludere qualsiasi percorso dall'indicizzazione inserendolo in PRUNEPATHS.
Il percorso inserito deve essere assoluto (deve partire dalla radice '/').
Si può escludere qualsiasi tipo di filesystem dall'indicizzazione inserendolo in PRUNEFS.
Detto questo, si può capire subito perché il mio disco esterno non veniva indicizzato.
Ubuntu monta automaticamente i drive removibili in /media e come si può vedere, /media è presente in PRUNEPATHS e quindi escluso dall'indicizzazione.
Individuare il file di configurazione eseguendo nel terminale: locate updatedb.conf (se si hanno errori che segnalano la mancanza di permessi, anteporre sudo al comando)
io ottengo:
/etc/updatedb.conf è il file da modificare.
Se si utilizza Gedit basta eseguire nel terminale: gedit /etc/updatedb.conf (come al solito, se ci fossero problemi anteporre sudo).
Aperto il file basta cancellare la stringa ' /media', salvare e aggiornare il database con:
sudo updatedb
io ho preferito fare una copia della riga da cui ho eliminato ' /media' e commentato la riga originale con '#' in modo da conservare la riga di default, così:
Aggiornato il database, (sudo updatedb), tutto quanto montato in /media sarà indicizzato da locate.
Fatto!
Si può utilizzare un metodo (non molto pratico) per effettuare ricerche solo su drive montati su /media:
creando un nuovo database che si occuperà di indicizzare solo quanto presente in /media per poi fare le ricerche con locate su questo.
Per creare il database:
sudo updatedb -U /path/da/indicizzare -o path_locate.db
per fare le ricerche con quel database:
sudo locate -d path_locate.db stringa_da_cercare
Un esempio della potenza di locate
Quanti files e directories ho sul filesystem? Voglio scriverne il numero e i nomi su un file di testo! Facile:
Per vedere le opzioni di locate: man locate.
Creo una directory per fare le prove contenente i file: casa.jpeg, casa.jpg, casa.JPG, casale.jpg, casato.jpg, gatto e aggiorno il database.
Fate tutte le prove che volete, io non ne ho più voglia! 8-p
Bye 8-)
Tutto il contenuto di questo sito se non diversamente dichiarato è di Giovanni Ubaldi ed è distribuito con Licenza:
Creative Commons Attribuzione - Condividi allo stesso modo 4.0 Internazionale.