Tutorial > Come usare Find e Locate per la ricerca di file su Linux

Come usare Find e Locate per la ricerca di file su Linux

Pubblicato il: 11 luglio 2022

Linux Sistema

Introduzione

Con Linux gli utenti meno esperti tendono ad avere alcuni problemi nella ricerca di file all'interno del sistema. Questa guida sarà dedicata alla spiegazione di due importanti comandi di ricerca utilizzabili all'interno del terminale.

I comandi in questione sono find e locate: entrambi ti consentiranno di trovare i files cercati, dandoti inoltre la possibilità di inserire delle condizioni o filtri, che essi dovranno rispettare per essere inclusi nei risultati delle tue ricerche.

I due comandi differiscono leggermente, sebbene siano dedicati allo stesso scopo.

Pre-Requisiti

Per provare i comandi di cui ti parleremo, sarà sufficiente disporre di una macchina con un sistema operativo Linux.

Necessiterai di privilegi sudo per utilizzare questi comandi, quindi assicurati di stare utilizzando un idoneo account utente non-root.

Ricerca per nome

La modalità più semplice di ricerca di un file è quella di trovare una corrispondenza con un suo identificativo.

Il comando find ti permette di utilizzare l'opzione -name per scegliere quale identificativo ricercare:

$ find -name "nomedaricercare"

La ricerca è case sensitive: il termine indica che vi sono strette regole di distinzione tra maiuscole e minuscole. Cercare il nome "miofile" , "MIOFILE" e "Miofile" non produrrà gli stessi risultati.

Per ricorrere a una ricerca più elastica, puoi valutare invece l'opzione -iname, la quale non distinguerà tra maiuscole e minuscole:

$ find -iname "nomedaricercare"

Se invece volessi ricorrere a una ricerca di risultati per esclusione, le opzioni precedenti possono essere precedute dalla voce -not oppure da \!: gli operatori di negazione, in informatica, permettono di negare o invertire il valore di verità della espressione che segue.

Un esempio sarebbe dire, in linguaggio naturale: "Trova tutti quei files che abbiano nome miofile." . Grazie all'operatore not, la frase dovrebbe seguire in questo modo: "Trova tutti quei files che NON abbiano nome miofile".

Nella pratica, l'uso dell'operatore not si traduce come segue, in forma di comando:

$ find -not -name "nomedaescludere"
$ find \! -name "nomedaescludere"

Ricerca per tipo

Puoi specificare il tipo di files che vorresti trovare, utilizzando l'opzione -type assieme al comando find:

$ find estensionefile
Per le estensioni, al comando sono associati dei descrittori:
  • f : file regolare
  • d : directory
  • l : link simbolico
  • c : character device, ovvero dispositivi di I/O come porte seriali, porte parallele, schede audio ecc..
  • b : block devices, un tipo speciale di file che rappresenta una periferica nei sistemi Unix

Un esempio di un comando da terminale, cercando dei particolari dispositivi in una directory specifica, sarebbe:

$ find /nomedirectory -type c

È possibile, infine , combinare i diversi filtri per restringere il campo di ricerca dei tuoi files.

Ad esempio, se volessi cercare tutti i file con estensione .conf nella directory /usr, dovresti usare questo comando:

$ find /usr -type f -name "*.conf"

Filtrare in base alla Dimensione e al Tempo

Il comando find ti permette di filtrare i risultati in funzione di dimensione e tempo.

Dimensione

Puoi applicare dei filtri sulla dimensione dei files, usando l'opzione -parameter e aggiungendo un descrittore che indichi l'unità di misura delle dimensioni del file:

  • c : bytes
  • k : kilobytes
  • M : megabytes
  • G : gigabytes
  • b : blocchi da 512-bytes

Alcuni esempi da mostrare con questi parametri:

  • $ find /dev -size 50c
    : trova tutti i files nella directory usr che abbiano dimensione di 50 bytes
  • $ find /usr -size -20c
    : trova tutti i files che abbiano dimensione inferiore a 20 bytes
  • $ find /home -size +700M
    : trova tutti i files nella directory home che abbiano dimensione superiore a 700 Megabytes

Tempo

Linux memorizza tutte le informazioni relative all'ultimo accesso, modifica e cambiamento di un file.

  • Access Time: l'ultima volta in cui il file è stato aperto o scritto
  • Modification Time: l'ultima volta in cui i contenuti del file sono stati modificati
  • Change Time: l'ultima volta in cui i metadati associati al file sono stati modificati

Puoi seguire i tre parametri utilizzando i descrittori -atime, -mtime , -ctime. A ogni descrittore va associato un valore che indichi il numero di giorni nel passato dall'ultimo tempo.

Per mostrarti degli esempi:

  • $ find /home -mtime 1

    Cerca i files, nella directory home, che siano stati modificati nell'ultimo giorno.

  • $ find /home -atime -1

    Nella stessa directory, trova i files nei quali sia stato effettuato l'accesso meno di un giorno fa.

  • $ find /home -ctime +2

    Nella stessa directory, trova i files a cui sono state modificati i metadati più di 2 giorni fa.

  • $ find /home -mmin -3

    In questo caso, tramite l'opzione -mmin, ricercherai tutti i files che abbiano subito una modifica negli ultimi 3 minuti. Grazie a -mmin, sarai stato in grado di dare una specifica in minuti , invece che in giorni.

Infine, il comando find è in grado di eseguire dei confronti tra files per restituire, ad esempio, il più nuovo rispetto a un altro file di paragone. Vedi l'esempio:

$ find / -newer filediriferimento

Ricerca in base al proprietario e ai permessi

Puoi anche cercare dei files che appartengano a un determinato utente o gruppo di utenti o files che dispongano di particolari permessi.

Ti mostriamo ora degli esempi che ti permettano di capire la sintassi del comando find con l'opzione -user o -group.

  • $ find /var -user nomeutente

    Questo comando ricercherà i files nella directory var che siano posseduti dallo user nomeutente.

  • $ find /etc -group nomegruppo

    Questo comando ricercherà i files nella directory etc che siano posseduti dal gruppo di utenti nomegruppo.

Puoi anche effettuare la ricerca di un file in funzione del valore di permessi a esso associati. I valori da inserire seguono una notazione in base 8, invece che decimale.

$ find / -perm 677
$ find / -perm -677

Mentre nel primo esempio verrà cercato il file con esattamente il numero di permessi specificato, nel secondo, aggiungendo il trattino, potrai cercare tutti i files che abbiano almeno quel numero di permessi. (maggiori o uguali di 677)

Ricerca per profondità

La profondità è quanto un file sia in fondo a una directory.

Puoi ricercare questi files ottenendo un'informazione sul percorso specifico, all'interno della directory in cui si trovano.

Immagina ci sia una directory con delle sottocartelle, tutte contenenti diversi files chiamati per numero. es. fileN.

Per iniziare, dovrai spostarti, da terminale, all'interno di quella directory, usando il comando cd:

$ cd nomedirectory

Successivamente, eseguendo la ricerca per nome:

utente@host:/nomedirectory$ find -name nomefile

Troverai tutti i files chiamati nomefile, all'interno della directory selezionata.

Puoi anche scegliere di contare il numero di risultati trovati, usando il comando assieme a un contatore, tramite il comando wc:

utente@host:/nomedirectory$ find -name nomefile | wc -l

L'output sarà un numero intero rappresentante il numero di files trovati.

Dato che a volte gli output possono essere davvero tanti, il comando find permette di specificare un massimo di profondità a cui arrivare, durante la ricerca dei files nella directory principale, tramite l'opzione -maxdepth, seguito da un valore numerico che indica il massimo livello di profondità da raggiungere.

utente@host:/nomedirectory$ find -maxdepth numeroprofondità -name nomefile

Puoi anche specificare un valore minimo di profondità da cui partire, tramite l'opzione -mindepth.

utente@host:/nomedirectory$ find -mindepth numeroprofondità -name nomefile

Le opzioni possono essere combinate per creare un range di profondità entro i quali cercare i files. Vedi nell'esempio:

utente@host:/nomedirectory$ find -mindepth minimolivelloprofondità -maxdepth massimolivelloprofondità -name nomefile

È importante saper combinare le opzioni per creare una ricerca più accurata e con risultati più selezionati.

Eseguire dei comandi sui risultati trovati

L'opzione -exec del comando find permette di eseguire un comando specifico sui risultati della ricerca.

Puoi usare la seguente sintassi:

$ find opzione -exec comandodaeseguire {} \;

Come puoi notare, questa istruzione è un po' più articolata delle precedenti. Nello specifico:

  • {} è usato per specificare che il comando vada applicato su tutti i files trovati dalla ricerca.
  • \; è usato per specificare la fine del comando

Per mostrarti, infine, dei comandi che racchiudano l'uso complesso del find :

  • utente@host:/nomedirectory$ find . -type f -perm 633 -exec chmod 667 {} \;

    Questo comando ricerca, nella directory nomedirectory, i files che abbiano un numero di permessi pari a 633 e cambia i valori in 667.

  • utente@host:/nomedirectory$ find . -type d -perm 755 -exec chmod 633 {} \;

    Questo comando ricerca, nella directory nomedirectory, le directories che abbiano un numero di permessi pari a 755 e cambia i valori in 633.

Il comando locate

Un comando alternativo per la ricerca dei files è il locate. Il comando locate è più veloce nel caso in cui si voglia cercare nell'intero sistema con facilità.

Per installare il comando, usa :

$ sudo apt update
$ sudo apt install mlocate

Su sistemi operativi come CentOS o derivazioni RedHat, puoi usare il comando dnf invece che apt.

Il comando locate risulta essere più rapido del find poichè usa un database in cui è contenuta una lista dei files contenuti nel sistema.

Il database si aggiorna in automatico ogni giorno per disporre delle liste più aggiornate ma, nel caso di particolari urgenza, potrai optare per un refresh manuale tramite:

$ sudo updatedb

Passando alla sintassi del comando locate, il comando più semplice è quello che permette di ricercare la stringa nel nome di un file o nel nome delle directory del suo percorso:

$ locate stringa

Per restringere la ricerca agli unici files, basterà usare il parametro -b :

$ locate -b stringa

Per ricercare i risultati presenti solo nel filesystem (file non rimossi nel momento tra l'aggiornamento del database e il lancio del comando locate), usa il parametro -e :

$ locate -e stringa

Puoi anche ottenere informazioni statistiche riguardanti i files e le directory presenti nel sistema, usando l'opzione -S:

$ locate -S

Esempio di output:

Comando locate

Conclusioni

Al termine di questo tutorial, sarai in grado di utilizzare entrambi i comandi find e locate per ricercare i files nel sistema nella maniera che ti è più congeniale.

Ricorda di usare:

  • find per costruire ricerche con filtri più articolati e eseguire combinazioni di comandi sui risultati trovati.

  • locate per eseguire ricerche più semplici e veloci, sfruttando la lista contenuta nel database.