Linux è un sistema operativo open source creato come al­ter­na­ti­va gratuita a UNIX. Come per UNIX, anche per Linux la riga di comando è uno strumento di lavoro fon­da­men­ta­le. At­tra­ver­so di essa, infatti, gli utenti possono inserire un comando che viene poi eseguito dal sistema.

Per trovare un file su Linux, è possibile uti­liz­za­re il comando find. Questo avvia una ricerca ricorsiva, che cerca a sua volta una gerarchia di directory seguendo de­ter­mi­na­ti criteri. Il comando find di Linux è uno strumento preciso per trovare file e directory ed è sup­por­ta­to dalla maggior parte delle di­stri­bu­zio­ni di Linux.

Registra il tuo dominio
  • Domain Connect gratuito per una con­fi­gu­ra­zio­ne facile del DNS
  • Cer­ti­fi­ca­to SSL Wildcard gratuito
  • Pro­te­zio­ne privacy inclusa

Una pa­no­ra­mi­ca del comando find di Linux

Per poter uti­liz­za­re il comando find di Linux, è ne­ces­sa­rio aprire la riga di comando. Nell’esempio qui riportato, si ha una visione della struttura generale del comando stesso:

find <percorso_directory > <cerca_parametro>
N.B.

Fate at­ten­zio­ne ai comandi sulla riga di comando. Eseguendo per errore il comando sbagliato, potreste dan­neg­gia­re il vostro sistema!

Per prima cosa, viene scritto il comando stesso, seguito da un percorso di directory e da un numero variabile di parametri di ricerca. Un parametro di ricerca consiste in un trattino che è im­me­dia­ta­men­te seguito dal nome del parametro. Questo è seguito da uno spazio e dal valore del parametro. Di seguito, vi mostriamo una pa­no­ra­mi­ca dei parametri di ricerca più co­mu­ne­men­te usati:

Parametro di ricerca Spie­ga­zio­ne
-name, -iname Filtra in base al nome del file
-type Filtra in base al tipo di file
-size, -empty Filtra in base alla di­men­sio­ne del file
-ctime, -mtime, -atime Filtra in base alla marca temporale del file
-user, -group Filtra in base al pro­prie­ta­rio e gruppo del file
-perm Filtra in base ai permessi del file

Molti parametri di ricerca possono anche essere combinati. Ciò pre­sup­po­ne im­pli­ci­ta­men­te un’ope­ra­zio­ne logica AND, che può essere scritta espli­ci­ta­men­te. Inoltre, è possibile usare un col­le­ga­men­to OR o negare una con­di­zio­ne:

Parametro di ricerca Spie­ga­zio­ne
-and I risultati della ricerca devono sod­di­sfa­re entrambe le con­di­zio­ni
-or I risultati della ricerca devono sod­di­sfa­re almeno una delle due con­di­zio­ni
-not Nega la con­di­zio­ne suc­ces­si­va

Na­tu­ral­men­te per poter eseguire gli esempi di codice riportati di seguito, bisognerà so­sti­tui­re i <se­gna­po­sti> con valori reali.

Come limitare la ricerca a una directory specifica

In questa sezione, si vedrà come limitare la ricerca a una directory specifica. Per cercare nella directory corrente, bisogna usare l’elemento “.” come percorso della directory:

find . <cerca_parametro>

Per avviare una ricerca nella cartella utente, è possibile usare la tilde “~” come percorso della directory:

find ~ <cerca_parametro>

Il comando find di Linux permette anche di avviare una ricerca nell’intero sistema. Tuttavia, a causa del gran numero di file e del livello della gerarchia di directory, questa ope­ra­zio­ne può ri­chie­de­re del tempo. Per cercare nell’intero sistema, bisogna uti­liz­za­re una barra obliqua “/” come percorso della directory:

find / <cerca_parametro>
N.B.

Quando si applica il comando find di Linux in com­bi­na­zio­ne con il parametro “-exec” all’intero sistema, bisogna fare par­ti­co­la­re at­ten­zio­ne!

Come per­so­na­liz­za­re l’output dei risultati della ricerca

I risultati ottenuti dalla ricerca tramite il comando find di Linux possono essere vasti. Per questa ragione, può essere utile in­fluen­za­re il modo in cui questi risultati vengono vi­sua­liz­za­ti. In questo caso, è im­por­tan­te fare uso delle co­sid­det­te pipe piuttosto che usare i parametri propri del comando. Le pipe su Linux sono utili per usare l’output di un comando come input di un altro comando.

Per avere un output dei risultati pagina per pagina, bisogna passare l’output del comando find al comando less:

find <percorso_directory> <cerca_parametro> | less

Per contare il numero di risultati, bisogna passare l’output del comando find al comando wc con il parametro “-l”:

find <percorso_directory> <cerca_parametro> | wc -l

Per poter vi­sua­liz­za­re solo i primi o gli ultimi n risultati della ricerca, è ne­ces­sa­rio passare l’output del comando find ai comandi “head” e “tail”. In entrambi i casi, si specifica il parametro “-n” seguito dal numero de­si­de­ra­to di risultati di ricerca:

find <percorso_directory> <cerca_parametro> | head -n <numero>
find <percorso_directory> <cerca_parametro> | tail -n <numero>

Come trovare dei file su Linux: casi d’uso semplici

Gli esempi riportati di seguito limitano la ricerca alla directory corrente e alle eventuali sot­to­di­rec­to­ry. Per passare a una qualsiasi directory è possibile usare il comando cd sulla riga di comando. Per testare questi esempi, bisognerà prima passare alla vostra cartella utente:

cd ~

Uti­liz­za­re il comando find di Linux per filtrare i file per nome

Per poter filtrare i file per nome, è con­si­glia­to uti­liz­za­re il parametro “-name”. Questo richiede il nome esatto del file ed è sensibile alle maiuscole, quindi distingue tra maiuscole e minuscole:

find . -name <Nome_file>

Nel seguente esempio, si ricerca un file con un nome specifico: “.gitignore”.

find . -name .gitignore

Per evitare la di­stin­zio­ne tra lettere minuscole e maiuscole è possibile ricorrere al parametro “-iname”. La “I” qui sta per “in­sen­si­bi­le”, da “case-in­sen­si­ti­ve”, ovvero “non sensibile alle maiuscole”:

find . -iname <Nome_file>

Di solito, è con­si­glia­to ef­fet­tua­re una prima ricerca che eviti la di­stin­zio­ne tra maiuscole e minuscole e usare il parametro “-name” solo se la ricerca con “-iname” re­sti­tui­sce troppi risultati.

Nel caso in cui non si voglia cercare il nome esatto di un file, ma si voglia piuttosto uti­liz­za­re un modello, bisognerà uti­liz­za­re l’asterisco come se­gna­po­sto “jolly” e scrivere il modello di ricerca tra vir­go­let­te (l’asterisco viene in­ter­pre­ta­to in­ter­na­men­te come valente “zero fino all’aggiunta di altri caratteri”). Nell’esempio qui riportato, si tenta di cercare i file e le directory il cui nome contenga il testo “git”:

find . -iname "*git*"

Uti­liz­za­re il comando find di Linux per filtrare i file in base al tipo

Un famoso aspetto della filosofia UNIX è il principio secondo il quale “tutto è un file”, il quale vale anche per Linux. Il termine “file” si riferisce ai file in un senso più ampio. In altre parole, le directory sono anche mappate come file su Linux. Tuttavia, per evitare di far con­fu­sio­ne, talvolta è usato il termine più preciso “de­scrit­to­re di file”.

Quando si parla di “tipo di file” su Linux, non ci si riferisce a una dif­fe­ren­zia­zio­ne tra un documento o file Excel e un’immagine JPEG. Su Linux si di­stin­guo­no piuttosto i diversi tipi di de­scrit­to­re di file esistenti. Il comando find di Linux ci fornisce il parametro di ricerca “-type” per poter filtrare i risultati a seconda del tipo di file. Ad esempio, è possibile di­stin­gue­re tra file e directory durante la ricerca. Di seguito, vi mostriamo una pa­no­ra­mi­ca dei tipi di file più co­mu­ne­men­te usati:

Tipo di file Spie­ga­zio­ne
f File
d Directory
l Link

Per poter includere solo i file nei risultati della ricerca, basta uti­liz­za­re il parametro “-type” seguito dal valore “f”:

find . -type f

Allo stesso modo, per includere solo le directory nei risultati di ricerca, è ne­ces­sa­rio uti­liz­za­re il parametro “-type” seguito dal valore “d”:

find . -type d

È infine possibile filtrare i risultati per esten­sio­ne di file, at­tra­ver­so il parametro “-iname” e uti­liz­zan­do l’asterisco come se­gna­po­sto.

Ad esempio, per cercare tutti i file esistenti con un’esten­sio­ne JPEG o jpeg:

find . -type f -iname "*.jpeg"

Ugual­men­te, per trovare tutti i file con l’esten­sio­ne jpeg/JPEG o jpg/JPG:

find . -type f -iname "*.jpeg" -or -iname "*.jpg"

Uti­liz­za­re il comando find di Linux per filtrare i risultati in base alla di­men­sio­ne

Su Linux il concetto stesso di file si ricollega a diverse in­for­ma­zio­ni, che includono almeno quanto segue:

  • Nome
  • Tipo di file
  • Di­men­sio­ne del file
  • Marca temporale
  • Pro­prie­ta­rio e gruppo
  • Permessi di accesso

Tutti questi attributi possono essere filtrati at­tra­ver­so il comando find, ac­com­pa­gna­to dai parametri ap­pro­pria­ti. Per poter filtrare i risultati di ricerca in base alla di­men­sio­ne del file, bisogna uti­liz­za­re il parametro “-size” seguito da una specifica della di­men­sio­ne.

Il comando find riportato di seguito re­sti­tui­sce dei file aventi una di­men­sio­ne di almeno 700 megabytes:

find . -size +700M
N.B.

La pos­si­bi­li­tà di filtrare i risultati in base alla di­men­sio­ne è di­spo­ni­bi­le solo per i file. Per quanto riguarda le directory, non viene me­mo­riz­za­ta alcuna in­for­ma­zio­ne riguardo alla di­men­sio­ne nel sistema dati. Tuttavia, se ne­ces­sa­rio, la di­men­sio­ne può essere calcolata ri­cor­si­va­men­te.

Le spe­ci­fi­che delle di­men­sio­ni con­si­sto­no in un numero seguito da un’unità. Di seguito ri­por­tia­mo una pa­no­ra­mi­ca delle unità di­spo­ni­bi­li:

Unità Spie­ga­zio­ne
c Bytes
k Kilobytes
M Megabytes
G Gigabytes
b 512-byte blocks

La specifica della di­men­sio­ne è in­ter­pre­ta­ta come la di­men­sio­ne esatta del file. Non risulta molto pratico dato che spesso la di­men­sio­ne esatta di un file cercato non è resa nota. Ciò che è utile in questi casi è la re­stri­zio­ne a un certo in­ter­val­lo di di­men­sio­ni. Per questo scopo, il numero è preceduto da un mo­di­fi­ca­to­re opzionale:

Mo­di­fi­ca­to­re Spie­ga­zio­ne
+ Il file è più grande delle di­men­sio­ni elencate
- Il file è più piccolo delle di­men­sio­ni elencate

Il comando seguente fornisce file più piccoli di 500 megabyte:

find . -size -500M

Il comando seguente fornisce invece dei file le cui di­men­sio­ni sono comprese tra i 400 e i 500 megabytes.

find . -size +400M -and -size -500M

Oltre a spe­ci­fi­ca­re una di­men­sio­ne esatta o un in­ter­val­lo di di­men­sio­ni, è di­spo­ni­bi­le un parametro separato per la ricerca di file vuoti “-empty”:

find . -type f -empty

Questo comando funziona anche per le directory:

find . -type d -empty

Uti­liz­za­re il comando find di Linux per filtrare i risultati in base alla marca temporale

Il sistema operativo gestisce il file system e registra quando si accede ai file. Nel processo vengono generate varie marche temporali. Linux genera diverse marche temporali per la creazione, l’ultima modifica e l’ultimo accesso a un file. Usando il comando find, è possibile filtrare e trovare queste marche temporali. Di seguito una pa­no­ra­mi­ca dei parametri di ricerca più uti­liz­za­ti:

Parametro di ricerca Spie­ga­zio­ne
-ctime, -cmin Filtra in base alla data di creazione
-mtime, -mmin Filtra in base alla data di modifica
-atime, -amin Filtra in base alla data d’accesso

Per trovare dei file che sono stati mo­di­fi­ca­ti solo il giorno pre­ce­den­te alla ricerca, è possibile uti­liz­za­re il parametro di ricerca “-mtime” seguito dal valore “1”:

find . -type f -mtime 1

I parametri di ricerca vi­sua­liz­za­ti con­te­nen­ti “time” nel nome in­ter­pre­ta­no il valore seguente come numero di giorni. I parametri con­te­nen­ti “min” nel nome in­ter­pre­ta­no invece il valore seguente come numero di minuti.

Così come quando si filtra in base alla di­men­sio­ne del file, anche in questo caso è possibile limitare il numero di giorni trascorsi in un in­ter­val­lo. Di nuovo, i segni più e meno sono usati come mo­di­fi­ca­to­ri:

Mo­di­fi­ca­to­re Spie­ga­zio­ne
+ La marca temporale risale a più giorni di quanto spe­ci­fi­ca­to
- La marca temporale risale a meno giorni di quanto spe­ci­fi­ca­to

Per poter trovare dei file creati più di 100 giorni prima rispetto al giorno della ricerca, bisogna uti­liz­za­re il parametro “-ctime” seguito dal valore “+100”.

find . -type f -ctime +100

Proprio come quando si filtra in base alla di­men­sio­ne del file, i parametri di ricerca possono essere combinati per coprire un in­ter­val­lo. Per trovare i file a cui si è avuto accesso tra i tre e i cinque giorni pre­ce­den­ti il giorno della ricerca, si usa il parametro di ricerca “-atime” due volte, ogni volta con i valori “+2” e “-6”. La com­bi­na­zio­ne esplicita tramite il parametro “-and” è opzionale:

find . -type f -atime +2 -and -atime -6

Per trovare dei file che sono stati mo­di­fi­ca­ti in un arco di tempo inferiore a 5 minuti dal momento della ricerca, è possibile uti­liz­za­re il parametro di ricerca “-mmin” seguito dal valore “-5”:

find . -type f -mmin -5

Uti­liz­za­re il comando find di Linux per filtrare i risultati in base al pro­prie­ta­rio, gruppo e permessi di accesso

Su Linux, a ogni file viene assegnato un utente che agisce come pro­prie­ta­rio. Inoltre, ogni file ap­par­tie­ne a un certo gruppo di utenti. Sulla base di questo, vi sono dei permessi di accesso definiti per ogni file. Anche in questo caso, è possibile usare il comando find per filtrare e trovare file su Linux. Di seguito ri­por­tia­mo una pa­no­ra­mi­ca dei parametri di ricerca uti­liz­za­ti:

Parametro di ricerca Spie­ga­zio­ne
-user Filtra in base all’utente
-group Filtra in base al gruppo
-perm Filtra in base ai permessi di accesso

Per cercare i file di proprietà dell’utente root, bisogna uti­liz­za­re il parametro di ricerca “-user” seguito dal valore “root”:

find . -user root

Per cercare i file di proprietà dell’utente stesso, si usa invece il parametro di ricerca “-user” seguito dall’espres­sio­ne “$(whoami)”. Quest’ultima viene risolta con il nome dell’utente connesso:

find . -user $(whoami)

Per cercare altri file che ap­par­ten­go­no al gruppo admin, bisogna uti­liz­za­re il parametro di ricerca “-group” seguito dal valore “admin”:

find . -group admin

Oltre al poter filtrare in base a pro­prie­ta­rio e gruppo, è anche possibile filtrare in base ai permessi di accesso. Per fare ciò, è ne­ces­sa­rio uti­liz­za­re una terzina di numeri ottali. I valori fre­quen­te­men­te usati sono “644”, “755”, ecc. Il primo numero definisce i permessi di accesso per il pro­prie­ta­rio, il secondo per il gruppo, il terzo per gli altri utenti. Ognuno dei tre numeri ottali viene creato sommando i permessi in­di­vi­dua­li. Potete trovare ulteriori in­for­ma­zio­ni in merito, nel nostro articolo riguardo l’as­se­gna­zio­ne dei permessi delle directory con chmod.

Per trovare dei file com­ple­ta­men­te ac­ces­si­bi­li per qualsiasi utente, bisogna uti­liz­za­re il parametro “-perm” seguito dal valore “777”:

find . -perm 777

Per trovare dei file com­ple­ta­men­te ac­ces­si­bi­li solo per il pro­prie­ta­rio, bisogna uti­liz­za­re il parametro “-perm” seguito dal valore “700”:

find . -perm 700

È anche possibile usare il comando find per trovare dei file su Linux che hanno, come minimo, i permessi spe­ci­fi­ca­ti. Per questo, bisogna ag­giun­ge­re il segno meno come prefisso al numero ottale:

find . -perm -007

Come limitare il livello di ri­cor­sio­ne del comando find di Linux

Nor­mal­men­te, il comando find di Linux passa ri­cor­si­va­men­te at­tra­ver­so tutte le sot­to­di­rec­to­ry. Tuttavia, è spesso utile limitare il livello di ri­cor­sio­ne. Per far ciò, si uti­liz­za­no i parametri di ricerca “-maxdepth” e “-mindepth”:

Parametro di ricerca Spie­ga­zio­ne
-maxdepth Massimo livello di ri­cor­sio­ne
-mindepth Minimo livello di ri­cor­sio­ne

Per ef­fet­tua­re una ricerca tra i file più grandi di 50 megabyte, in­clu­den­do solo le directory che non sono profonde più di due livelli rispetto alla directory corrente, si utilizza il seguente comando:

find . -type f -maxdepth 2 -size +50M

Per ef­fet­tua­re una ricerca tra i file più grandi di 50 megabyte, in­clu­den­do solo le directory che sono profonde almeno tre livelli e non più di cinque livelli in più rispetto alla directory corrente, si utilizza il seguente comando:

find . -type f -mindepth 3 -and -maxdepth 5 -size +50M

Uti­liz­za­re il comando find di Linux per trovare e pro­ces­sa­re i file

Finora ci siamo limitati a trovare dei file su Linux. Tuttavia, molti casi d’uso ri­chie­do­no l’ela­bo­ra­zio­ne di massa dei file trovati. Scenari comuni includono la ri­pa­ra­zio­ne dei permessi di accesso per software basati sul web come WordPress o l’eli­mi­na­zio­ne di file dopo un attacco hacker. Anche per questi casi, si ricorre al comando find.

Ora, bisognerà con­si­de­ra­re lo schema generale per eseguire un comando per ogni file trovato. Per questo scopo si utilizza il parametro “-exec”, seguito da un comando Linux e dai suoi parametri. L’intero comando è terminato dal testo “{} \;” che rimane sempre costante:

find <percorso_directory> <find_parametro> -exec <comando_and_parametro> {} \;

Notate che l’ese­cu­zio­ne del comando avviene senza che vi venga richiesto! Inoltre, a seconda dei parametri di ricerca se­le­zio­na­ti e del comando dato, l’ese­cu­zio­ne del comando find con il parametro “-exec” può causare gravi danni al sistema.

Per limitare questo rischio, si può ricorrere al parametro “-ok” che è simile al parametro “-exec”. In questo modo viene forzata la conferma in­te­rat­ti­va per l’ela­bo­ra­zio­ne di ogni singolo file trovato:

find <percorso_directory> <cerca_parametro> -ok <comando_and_parametro> {} \;

Per pre­cau­zio­ne, nei seguenti esempi si limita il livello di ri­cor­sio­ne a una sola sot­to­di­rec­to­ry tramite “-maxdepth 1”.

N.B.

Fate at­ten­zio­ne ai seguenti esempi. Con­si­glia­mo for­te­men­te di creare una cartella personale per provarli. Passate a questa cartella prima di eseguire gli esempi per essere sicuri di non dan­neg­gia­re il vostro sistema!

Uti­liz­za­re il comando find di Linux per regolare l’utente e i gruppi

Per impostare il pro­prie­ta­rio e il gruppo di tutti i file e le directory al valore “www-data” sarà ne­ces­sa­rio usare il seguente comando find con il comando chown:

find . -maxdepth 1 -exec chown www-data:www-data {} \;

Uti­liz­za­re il comando find di Linux per regolare i permessi dei file

Per poter trovare i file con permessi “777” e im­po­star­li a “664” è ne­ces­sa­rio uti­liz­za­re il seguente comando find con il comando chmod:

find . -type f -maxdepth 1 -perm 777 -exec chmod 664 {} \;

Per impostare i permessi di tutte le directory a “755”, si usa il seguente comando find con il comando chmod:

find . -type d -maxdepth 1 -exec chmod 755 {} \;

Uti­liz­za­re il comando find di Linux per eliminare directory e file vuoti

È anche possibile uti­liz­za­re il comando find per eliminare i file e le directory trovate. Per pre­cau­zio­ne, nei seguenti esempi ciò viene mostrato solo per i file e le directory vuote. Inoltre, invece del parametro “-exec”, viene uti­liz­za­to il parametro “-ok” per forzare l’utente ad accettare espli­ci­ta­men­te l’ope­ra­zio­ne di eli­mi­na­zio­ne.

Per eliminare tutte le directory Linux vuote, si utilizza il seguente comando find ac­com­pa­gna­to dal comando rmdir:

find . -type d -maxdepth 1 -empty -ok rmdir {} \;

Per eliminare tutti i file di Linux vuoti, è invece possibile uti­liz­za­re il seguente comando find ac­com­pa­gna­to dal comando rm:

find . -type f -maxdepth 1 -empty -ok rm {} \;
Vai al menu prin­ci­pa­le