Le miniguide di UbaWeb

Cercare con locate su supporti removibili

Premessa Torna su

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.

Introduzione a Locate Torna su

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ì:

8-) cat /etc/updatedb.conf PRUNE_BIND_MOUNTS="yes" # PRUNENAMES=".git .bzr .hg .svn" PRUNEPATHS="/tmp /var/spool /media" PRUNEFS="NFS nfs nfs4 rpc_pipefs afs binfmt_misc proc smbfs autofs iso9660 ncpfs coda devpts ftpfs devfs mfs shfs sysfs cifs lustre_lite tmpfs usbfs udf fuse.glusterfs fuse.sshfs ecryptfs fusesmb devtmpfs"

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_MOUNTS

Si 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".

PRUNENAMES

Si 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.

PRUNEPATHS

Si può escludere qualsiasi percorso dall'indicizzazione inserendolo in PRUNEPATHS.
Il percorso inserito deve essere assoluto (deve partire dalla radice '/').

PRUNEFS

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.

Procedimento in breve Torna su

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:

8-) locate updatedb.conf /etc/updatedb.conf /etc/updatedb.conf.dpkg-dist /usr/share/man/man5/updatedb.conf.5.gz

/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ì:

PRUNE_BIND_MOUNTS="yes" # PRUNENAMES=".git .bzr .hg .svn" # PRUNEPATHS="/tmp /var/spool /media" PRUNEPATHS="/tmp /var/spool" PRUNEFS="NFS nfs nfs4 rpc_pipefs afs binfmt_misc proc smbfs autofs iso9660 ncpfs coda devpts ftpfs devfs mfs shfs sysfs cifs lustre_lite tmpfs usbfs udf fuse.glusterfs fuse.sshfs ecryptfs fusesmb devtmpfs"

Aggiornato il database, (sudo updatedb), tutto quanto montato in /media sarà indicizzato da locate.
Fatto!

Database apposito per /media

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

Prove di utilizzo di locate Torna su

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:

locate -c * > dati_filesystem.txt # * qualsiasi serie di caratteri. -c conta i risultati. > Redirige l'output su file locate * >> dati_filesystem.txt # >> redirige l'output in append mode, (accoda, senza sovrascrivere il file)

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.

8-) mkdir prova_locate 8-) cd prova_locate 8-) touch casa.jpeg casa.jpg casa.JPG casale.jpg casato.jpg gatto 8-) sudo updatedb

Utilizzo di base:
locate casa | less # passando i risultati a less si ha la paginazione. Tasto q per uscire.

Con il comando visto sopra, si ottengono una marea di risultati, infatti vengono intercettate tutte le stringhe corrispondenti a *casa*, quindi con globbing

quanti sono i risultati? Si possono contare con:
8-) locate -c casa 1552

ma io voglio solo quelli con 'casa' in 'prova_locate', quindi:
8-) locate */prova_locate*casa*: /home/giovanni/Scrivania/dir_prova/prova_locate/casa.JPG /home/giovanni/Scrivania/dir_prova/prova_locate/casa.jpeg /home/giovanni/Scrivania/dir_prova/prova_locate/casa.jpg /home/giovanni/Scrivania/dir_prova/prova_locate/casale.jpg /home/giovanni/Scrivania/dir_prova/prova_locate/casato.jpg 8-)

io uso quasi sempre grep in pipe (anche più di uno):
8-) locate /prova_locate | grep casa /home/giovanni/Scrivania/dir_prova/prova_locate/casa.JPG /home/giovanni/Scrivania/dir_prova/prova_locate/casa.jpeg /home/giovanni/Scrivania/dir_prova/prova_locate/casa.jpg /home/giovanni/Scrivania/dir_prova/prova_locate/casale.jpg /home/giovanni/Scrivania/dir_prova/prova_locate/casato.jpg 8-)

per i file JPG (solo maiuscolo) in prova_locate:
8-) locate */prova_locate*JPG /home/giovanni/Scrivania/dir_prova/prova_locate/casa.JPG 8-)

jpg e JPG (-i case insensitive):
8-) locate -i */prova_locate*JPG /home/giovanni/Scrivania/dir_prova/prova_locate/casa.JPG /home/giovanni/Scrivania/dir_prova/prova_locate/casa.jpg /home/giovanni/Scrivania/dir_prova/prova_locate/casale.jpg /home/giovanni/Scrivania/dir_prova/prova_locate/casato.jpg 8-)

solo jpeg (anche varianti maiuscole):
8-) locate -i */prova_locate*JP?G /home/giovanni/Scrivania/dir_prova/prova_locate/casa.jpeg 8-)

tutte le stringhe jpg JpeG etc.:
8-) locate -i */prova_locate*JP*G /home/giovanni/Scrivania/dir_prova/prova_locate/casa.JPG /home/giovanni/Scrivania/dir_prova/prova_locate/casa.jpeg /home/giovanni/Scrivania/dir_prova/prova_locate/casa.jpg /home/giovanni/Scrivania/dir_prova/prova_locate/casale.jpg /home/giovanni/Scrivania/dir_prova/prova_locate/casato.jpg 8-)

di tutte le stringhe jpg JpeG etc solo il primo risultato (-n INTERO):
8-) locate -i -n 1 */prova_locate*JP*G /home/giovanni/Scrivania/dir_prova/prova_locate/casa.JPG

il contenuto di '/prova_locate' che non contenga 'casa':
8-) locate /prova_ locate | grep -v casa /home/giovanni/Scrivania/dir_prova/prova_locate /home/giovanni/Scrivania/dir_prova/prova_locate/gatto 8-)

dati del file:
8-) locate /prova_locate | grep casa.jpg | xargs ls -lah -rw-r--r-- 1 giovanni giovanni 0 mar 24 11:10 /home/giovanni/Scrivania/dir_prova/prova_locate/casa.jpg 8-)

Fate tutte le prove che volete, io non ne ho più voglia! 8-p
Bye 8-)

Torna su
Sito realizzato da: UbaWeb di Giovanni Ubaldi

Licenza Creative Commons 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.