Jul 122012
 

Ho appena realizzato che non ho mai scritto niente su uno dei miei comandi preferiti della shell di Linux: locate .
Questo comando prende come input il nome (o parte di esso) e subito vi fornisce tutti i percorsi in cui si trova il file, un’alternativa a questo potrebbe essere utilizzare il comando find , ma c’è una differenza enorme nel tempo che utilizza find per cercare all’interno di file system di grandi dimensioni rispetto ad un locate , questa differenza è data dal fatto che locate usa un proprio database in cui memorizza tutti i nomi dei file, mentre find esegue una scansione della directory e cerca il nome del file che avete dato come input.


mlocate.db il database di locate

Per avere un output consistente, bisogna avere il database con l’elenco dei file aggiornato. Il sistema operativo può essere configurato per farlo in maniera automatica con un cron. Ad esempio sulla mia Ubuntu 12.04 ho visto che è presente il file
/etc/cron.daily/mlocate che si occupa di aggiornare il database una volta al giorno.

Se l’impostazione predefinita della propria distribuzione non è efficiente, l’aggiornamento può essere fatto manualmente tramite il comando sudo updatedb (richiede accesso come root), questo è molto comodo anche quando avete appena installato dei pacchetti e magari cercate un file, il tempo per eseguire un updatedb è comunque sempre minore di un find su tutto il sistema.

Il database si trova solitamente in

/var/lib/mlocate/mlocate.db

ed è possibile controllare quali file e/o file system verranno aggiunti mentre esegue la costruzione del database con il suo file di configurazione che si trova in

 /etc/updatedb.conf

Questo è il contenuto del mio file di configurazione:

PRUNE_BIND_MOUNTS="yes"
# PRUNENAMES=".git .bzr .hg .svn"
PRUNEPATHS="/tmp /var/spool /media /home/.ecryptfs"
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 curlftpfs ecryptfs fusesmb devtmpfs"

Quando una directory corrisponde a PRUNEFS, PRUNENAMES o PRUNEPATHS, updatedb non analizza il contenuto della directory. il
percorso della directory stesso, tuttavia, è inserito nel database creato. Queste sono in dettaglio le opzioni che è possibile utilizzare in questo file:

  •      PRUNEFS: una lista separata da spazi di tipi di file system (come quelli usati in /etc/mtab), che non dovrebbero essere scanditi da updatedb. Questo parametro è case-insensitive. Per impostazione predefinita, nessun tipo di file system viene ignorato. Quando la scansione di un file system viene saltata, tutti i file system montati nella sottostruttura sono anche saltati, anche se il tipo non corrisponde ad alcuna voce in PRUNEFS.
  •      PRUNENAMES: Una lista separata da spazi dei nomi delle directory (senza percorsi) che non dovrebbero essere esaminati da updatedb. Per impostazione predefinita, nessun nome di directory viene ignorato. Si noti che solo le directory possono essere specificate, e nessun meccanismo di pattern (es. globbing) viene utilizzato.
  •      PRUNEPATHS: Una lista separata da spazi dei nomi di percorsi di directory che non dovrebbero essere esaminati da updatedb. Ogni percorso deve essere esattamente nella forma in cui la directory verrebbe segnalata da locate. Per impostazione predefinita, i percorsi non sono saltati.
  •      PRUNE_BIND_MOUNTS: una delle stringhe 0, no, 1 o yes. Se PRUNE_BIND_MOUNTS è 1 o yes, bind mounts non vengono analizzati da updatedb. Tutti i file system montati nella sottostruttura di un mount bind sono saltati a loro volta. Per impostazione predefinita, i bind mounts non vengono ignorati.

Utilizzare locate

Ora che abbiamo impostato la nostra banca dati possiamo usare il comando locate dalla riga di comando (come utente o come root, come si preferisce) questi sono alcuni esempi su come utilizzare questo utile strumento:

Uso base – Cercare un file

$ locate php.ini

Si produrrà un elenco dei luoghi dove si può trovare file denominati php.ini. Questo comando potrebbe produrre i seguenti risultati:

/etc/php5/cgi/php.ini
/etc/php5/cli/php.ini
/etc/php5/fpm/php.ini
/usr/share/doc/php5-common/examples/php.ini-development
/usr/share/php5/php.ini-production
/usr/share/php5/php.ini-production.cli

Molto utile quando si cerca l’opzione php e non si ricorda esattamente dove si trova il file php.ini.

Sopprimere i messaggi di errore

È possibile utilizzare l’opzione -q per sopprimere i messaggi di errore. I messaggi di errore in genere sono messaggi che dicono che il permesso per accedere ai file non è autorizzato dal momento che si è solo un utente (non superuser). L’opzione -q serve a non mostrare tutti questi messaggi.

$ locate .php -q

Limitare l’output

È possibile utilizzare l’opzione -n per limitare il numero di risultati restituiti ad un numero specifico. Ad esempio si potrebbe chiedere di avere solo 10 risultati della ricerca con il seguente comando

$ locate .php -n 10

Questo ci darà come output solo i primi 10 risultati.

Contare il numero di risultati

È possibile utilizzare l’opzione -c per avere solo il numero totale dei risultati di una ricerca, nell’esempio seguente conto tutti i file con estensione .php:

$ locate .php -c
3414

case insensitive

È possibile utilizzare l’opzione -i nel caso in cui si desideri eseguire una ricerca insensibile al maiuscolo/minuscolo.

$ locate INDEX.php -i

Ciò troverà qualsiasi di questi nomi di file:

index.php INDEX.PHP Index.php

Ottenere informazioni sul database

E come ultima opzione, è possibile ottenere statistiche sul proprio database con l’opzione –statistics, questo non farà alcuna ricerca, ma stamperà le informazioni sul vostro mlocate.db

$ locate --statistics
Database /var/lib/mlocate/mlocate.db:
	6146 directories
	57770 files
	3564748 bytes in file names
	1612746 bytes used to store database


Conclusioni

Questo comando mi ha salvato molte volte in molte situazioni diverse, ed è un must su qualsiasi server o desktop che uso, non ho incluso una parte sull’installazione in questo breve articolo, in quanto locate dovrebbe essere disponibile in qualsiasi distribuzione Linux, di solito in un pacchetto con il nome mlocate, e così si può facilmente utilizzare il vostro gestore di pacchetti per l’installazione, e sono sicuro che vi piacerà.

Popular Posts:

Flattr this!

  7 Responses to “Trovare file su Linux con il comando locate”

  1. It’s a perfect command! Before that I read this post, I searched files like this:
    find / | grep filename
    But locate command is really faster than find!
    Thanks

  2. “I just realized that I’ve never wrote anything”

    Shurely u meen “rotten”????……

    Hope this helpsh….

    • Dear Peter,
      Sorry but not, this not help much 🙂
      If you could send me the correct English phrase perhaps this would really help.

      Best Regards

      • written.
        I write today, I wrote yesterday, I’ve written all week.

        “rotten” sounds like “written”…

  3. well done, good reminder of a great command. thanks for posting it.

  4. (1) The pedant should be satisfied with “I just realized that I’ve never written anything about one of my favorite commands on the Linux shell: locate”

    (2) The database can be manually updated with <code sudo updatedb

 Leave a Reply

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

(required)

(required)

*