back to top

Linux find: cercare tra i file

In questa lezione vedremo come effettuare delle ricerche per trovare file e/o directory all’interno del nostro file system. Per fare ciò Linux dispone di diversi comandi, in questa lezione della nostra guida vedremo come funzionano e a cosa servono i tre principali per la ricerca tra i file del sistema operativo: find, locate e grep.

In questa lezione della nostra guida analizzeremo nel dettaglio il comando Linux find per effettuare ricerche all’interno del filesystem attravereso l’utilizzo di diversi fattori e criteri di ricerca.

Premessa

Il comando find di Linux consente di ricercare file e directory in base al nome, alla data di creazione o alla dimensione. Il comando find è molto potente… ma attenzione, talvolta è anche piuttosto lento nel restituire i risultati, soprattutto se il nostro disco è pieno di file e cartelle tra cui effettuare la ricerca!

Vediamo come usare il comando find di Linux in diverse situazioni ed esigenze.

Utilizzare find per cercare in base al nome

Se volessimo cercare in base al nome useremo l’opzione -name, in questo modo:

find /directory/dove/cercare/ -name file_da_cercare

Se ad esempio volessimo cercare in tutta la macchina tutti i file che si chiamano "pippo.jpg", useremo:

find / -name "pippo.jpg"

Attenzione: così facendo la ricerca è case sensitive, cioè distingue tra minuscole e maiuscole. Se volessimo fare una ricerca che non consideri questa differenze dovremo usare l’opzione -iname (che si dice, appunto, case insensitive).

find / -iname "pippo.jpg"

Così facendo otterremo anche "Pippo.jpg" o "PIPPO.jpg".

Si noti che find supporta anche il carattere speciale asterisco (* o wildcard) che consente di indicare "qualsiasi stringa". Ad esempio:

find / -name "*.jpg"

consente di trovare tutti i file che hanno come estensione JPG.

Interessante anche l’opzione -not che consente di invertire l’esito di una ricerca. Si supponga, ad esempio, di voler trovare tutti i file che hanno una estensione diversa da JPG:

find / -not -name "*.jpg"

Utilizzare find per cercare in base alla data di creazione o modifica

Se volessimo cercare in base alla data di creazione del file useremo l’opzione -ctime (Last Change Time) seguita dall’età (espressa in giorni) del file da cercare.

find /directory/dove/cercare/ -ctime età_in_giorni

Se ad esempio volessimo cercare nella directory /home/web/miosito/ un file creato o modificato 7 giorni fa useremo:

find /home/web/miosito/ -ctime 7

Se volessimo trovare file e cartelle più vecchi di 7 giorni useremmo:

find /home/web/miosito/ -ctime +7

Se volessimo trovare file e cartelle con meno di 7 giorni useremmo:

find /home/web/miosito/ -ctime -7

Oltre a -ctime esistono altre due interessanti opzioni per le ricerche basate sulle date, si tratta di -atime (Last Access Time) e -mtime (Last Modification Time). La prima opzione consente di cercare file in base all’ultima data di accesso, la seconda in base alla data di ultima modifica del file.

La differenza tra -ctime e -mtime sta nel fatto che la prima opzione considera anche i cambiamenti nei metadati (ad esempio utente o gruppo proprietario) mentre il secondo considera solo le modifiche ai contenuti del file.

Utilizzare find per cercare in base alla dimensione

Se, per finire, volessimo cercare in base al peso del file useremo l’opzione -size seguita dalla dimensione in Kb. Così facendo find restituirà tutti i file di dimensione uguale o superiore alla misura indicata.

find /directory/dove/cercare/ -size dimensione_del_file

Se ad esempio volessimo cercare nella directory /home/web/miosito/fotografie/ tutti i file con dimensione esatta di 100 Kb scriveremo:

find /home/web/miosito/fotografie/ -size 100k

Se, viceversa, cercassimo file più piccoli di 100 Kb utilizzeremmo:

find /home/web/miosito/fotografie/ -size -100k

Per cercare file più grandi di 100 Kb, invece, scriveremo:

find /home/web/miosito/fotografie/ -size +100k

Come potete vedere la dimensione è espressa da un numero seguito dall’unità di misura. Le unità di misura accettate da find sono le seguenti:

  • b: 512-byte blocks (default)
  • c: bytes
  • w: two-byte words
  • k: Kilobytes
  • M: Megabytes
  • G: Gigabytes

Trovare file di grandi dimensioni

A volte è necessario fare un po’ di pulizia all’interno del proprio computer, magari per liberare spazio da un hard-disk sempre più intasato di file. Il modo più semplice per liberare spazio, ovviamente, è quello di eleiminare file di grandi dimensioni non più utili o comunque troppo ingombranti.

Per trovare i file di grandi dimension all’interno del nostro OS Linux non dovremo far altro che utilizzare find nel modo appena visto, specificando un valore molto grande:

find -size +100M

Attraverso il comando find e l’opzione -size abbiamo chiesto al sistema di elencare tutti i file di dimensioni maggiori di 100 Mb.

Volendo possiamo anche filtrare i risultati escludendo dal listato certe tipologie di file, ad esempio:

find -size +100M -not -name *.mp4

Con questa istruzione otterremo un elenco di file con dimensioni maggiori di 100Mb ma andremo ad escludere i file mp4.

Ordinare i risultati in base alla dimensione del file

Come avrete notato, il comando find non ordina i risultati secondo il criterio a noi più utile. Sarebbe comodo, infatti, che i file trovati venissero orinati dal più grande al più piccolo.

Per ottenere questo risultato abbiamo bisogno di utilizzare un’istruzione più complessa:

find -size +100M -exec ls -sh {} ; | sort -n -r | head -10

In pratica abbiamo lanciato find e poi, attraverso exec, il comando ls. Dei risultati ottenuti abbiamo fatto il sorting e poi abbiamo limitato la visualizzazione ai primi 10 risultati.

Utilizzare find per trovare file e cartelle di uno specifico utente

Per fare questo tipo di ricerca utilizzeremo -user in questo modo:

find /directory/dove/cercare/ -user nome_dell_utente

Utilizzare find per scovare file e cartelle vuote

Un altro interessante utilizzo di find consiste nella capacità di trovare file e directory vuote. Per farlo useremo questa sintassi:

find /directory/dove/cercare/ -empty

Se volessimo limitare la ricerca alle sole cartelle aggiungeremo -type seguito dal valore "d" (che indica le directory):

find / -type d -empty

Per cercare solo file useremo, invece, il valore "f":

find / -type f -empty

Limitare la profondità della ricerca

Come detto le ricerce con find possono essere piuttosto lente, per questo motivo può essere utile limitare la profondità della ricerca. A tal fine si ricorre a -maxdepth seguito dal numero di livelli in cui cercare.

Se volessimo cercare solo nella cartella corrente (e non anche nelle sue eventuali sotto-cartelle) utilizzeremo:

find / -maxdepth 1 -name "pippo.jpg"

Con questo comando cercheremo i file che si chiamano "pippo.jpg" solo nella cartella corrente.

Cancellare i file trovati con find

Un altro comodo utilizzo di find riguarda la cancellazione di file. Si supponga, ad esempio, di voler trovare e cancellare i file temporanei (contraddistinti da estensione ".temp").

Per farlo ricorreremo a questa sintassi:

find / -name "*.temp" -delete

Come potete vedere si tratta di una semplice ricerca al cui termine viene aggiunta l’istruzione -delete.

Pubblicità
Massimiliano Bossi
Massimiliano Bossi
Stregato dalla rete sin dai tempi delle BBS e dei modem a 2.400 baud, ho avuto la fortuna di poter trasformare la mia passione in un lavoro (nonostante una Laurea in Giurisprudenza). Adoro scrivere codice e mi occupo quotidianamente di comunicazione, design e nuovi media digitali. Orgogliosamente "nerd" sono il fondatore di MRW.it (per il quale ho scritto centinaia di articoli) e di una nota Web-Agency (dove seguo in prima persona progetti digitali per numerosi clienti sia in Italia che all'estero).