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 particolare, questa guida si concentra sul comando Linux find per effettuare ricerche all’interno del filesystem attraverso l’utilizzo di diversi fattori e criteri di ricerca.
Il comando find è molto potente e flessibile, permettendo di cercare file in base a molteplici condizioni. Tuttavia, è importante notare che può risultare piuttosto lento nel restituire i risultati, specialmente su dischi contenenti un gran numero di file e cartelle.
Indice
- Premessa
- Utilizzare find per cercare in base al nome
- Utilizzare find per cercare in base alla data di creazione o modifica
- Utilizzare find per cercare in base alla dimensione
- Utilizzare find per trovare file e cartelle di uno specifico utente
- Utilizzare find per scovare file e cartelle vuote
- Limitare la profondità della ricerca
- Cancellare i file trovati con find
Premessa
Il comando find di Linux consente di ricercare file e directory in base al nome, alla data di creazione o modifica, alle dimensioni e altri parametri. Prima di procedere con esempi pratici, assicuriamoci di avere una comprensione di base della sintassi del comando.
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, nel seguente modo:
find /directory/dove/cercare/ -name file_da_cercare
Ad esempio, se volessimo cercare in tutta la macchina tutti i file che si chiamano “pippo.jpg”, useremo:
find / -name "pippo.jpg"
Attenzione: in questo modo la ricerca è case sensitive, cioè distingue tra minuscole e maiuscole. Se volessimo effettuare una ricerca che non consideri questa differenza, dovremo utilizzare l’opzione -iname (che si dice, appunto, case insensitive).
find / -iname "pippo.jpg"
In questo modo otterremo anche risultati come “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"
Questo comando 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 un’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
Ad esempio, se volessimo cercare nella directory /home/web/miosito/ un file creato o modificato 7 giorni fa, useremo:
find /home/web/miosito/ -ctime 7
Per trovare file e cartelle più vecchi di 7 giorni, useremmo:
find /home/web/miosito/ -ctime +7
Per trovare file e cartelle con meno di 7 giorni, useremmo:
find /home/web/miosito/ -ctime -7
Oltre a -ctime, esistono altre due opzioni interessanti per le ricerche basate sulle date: -atime (Last Access Time) e -mtime (Last Modification Time). La prima opzione consente di cercare file in base all’ultima data di accesso, mentre la seconda considera solamente il file stesso.
È importante notare che 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 si concentra sulle 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
Ad esempio, se 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, 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 è quello di eliminare file di grandi dimensioni non più utili o comunque troppo ingombranti.
Per trovare i file di grandi dimensioni 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, escludendo 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 ordinati 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 nel seguente 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 ricerche 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.