Comando find di Linux: cercare e trovare i file

Linux è un sistema operativo open source creato come alternativa gratuita a UNIX. Come per UNIX, anche per Linux la riga di comando è uno strumento di lavoro fondamentale. Attraverso di essa, infatti, gli utenti possono inserire un comando che viene poi eseguito dal sistema.

Per trovare un file su Linux, è possibile utilizzare il comando find. Questo avvia una ricerca ricorsiva, che cerca a sua volta una gerarchia di directory seguendo determinati criteri. Il comando find di Linux è uno strumento preciso per trovare file e directory ed è supportato dalla maggior parte delle distribuzioni di Linux.

Una panoramica del comando find di Linux

Per poter utilizzare il comando find di Linux, è necessario 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 attenzione ai comandi sulla riga di comando. Eseguendo per errore il comando sbagliato, potreste danneggiare 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 è immediatamente seguito dal nome del parametro. Questo è seguito da uno spazio e dal valore del parametro. Di seguito, vi mostriamo una panoramica dei parametri di ricerca più comunemente usati:

Parametro di ricerca

Spiegazione

-name, -iname

Filtra in base al nome del file

-type

Filtra in base al tipo di file

-size, -empty

Filtra in base alla dimensione del file

-ctime, -mtime, -atime

Filtra in base alla marca temporale del file

-user, -group

Filtra in base al proprietario e gruppo del file

-perm

Filtra in base ai permessi del file

Molti parametri di ricerca possono anche essere combinati. Ciò presuppone implicitamente un’operazione logica AND, che può essere scritta esplicitamente. Inoltre, è possibile usare un collegamento OR o negare una condizione:

Parametro di ricerca

Spiegazione

-and

I risultati della ricerca devono soddisfare entrambe le condizioni

-or

I risultati della ricerca devono soddisfare almeno una delle due condizioni

-not

Nega la condizione successiva

Naturalmente per poter eseguire gli esempi di codice riportati di seguito, bisognerà sostituire i <segnaposti> 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 operazione può richiedere del tempo. Per cercare nell’intero sistema, bisogna utilizzare una barra obliqua “/” come percorso della directory:

find / <cerca_parametro>
N.B.

Quando si applica il comando find di Linux in combinazione con il parametro “-exec” all’intero sistema, bisogna fare particolare attenzione!

Come personalizzare 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 influenzare il modo in cui questi risultati vengono visualizzati. In questo caso, è importante fare uso delle cosiddette 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 visualizzare solo i primi o gli ultimi n risultati della ricerca, è necessario passare l’output del comando find ai comandi “head” e “tail”. In entrambi i casi, si specifica il parametro “-n” seguito dal numero desiderato 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 sottodirectory. 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 ~

Utilizzare il comando find di Linux per filtrare i file per nome

Per poter filtrare i file per nome, è consigliato utilizzare 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 distinzione tra lettere minuscole e maiuscole è possibile ricorrere al parametro “-iname”. La “I” qui sta per “insensibile”, da “case-insensitive”, ovvero “non sensibile alle maiuscole”:

find . -iname <Nome_file>

Di solito, è consigliato effettuare una prima ricerca che eviti la distinzione tra maiuscole e minuscole e usare il parametro “-name” solo se la ricerca con “-iname” restituisce troppi risultati.

Nel caso in cui non si voglia cercare il nome esatto di un file, ma si voglia piuttosto utilizzare un modello, bisognerà utilizzare l’asterisco come segnaposto “jolly” e scrivere il modello di ricerca tra virgolette (l’asterisco viene interpretato internamente 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*"

Utilizzare 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 confusione, talvolta è usato il termine più preciso “descrittore di file”.

Quando si parla di “tipo di file” su Linux, non ci si riferisce a una differenziazione tra un documento o file Excel e un’immagine JPEG. Su Linux si distinguono piuttosto i diversi tipi di descrittore 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 distinguere tra file e directory durante la ricerca. Di seguito, vi mostriamo una panoramica dei tipi di file più comunemente usati:

Tipo di file

Spiegazione

f

File

d

Directory

l

Link

Per poter includere solo i file nei risultati della ricerca, basta utilizzare il parametro “-type” seguito dal valore “f”:

find . -type f

Allo stesso modo, per includere solo le directory nei risultati di ricerca, è necessario utilizzare il parametro “-type” seguito dal valore “d”:

find . -type d

È infine possibile filtrare i risultati per estensione di file, attraverso il parametro “-iname” e utilizzando l’asterisco come segnaposto.

Ad esempio, per cercare tutti i file esistenti con un’estensione JPEG o jpeg:

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

Ugualmente, per trovare tutti i file con l’estensione jpeg/JPEG o jpg/JPG:

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

Utilizzare il comando find di Linux per filtrare i risultati in base alla dimensione

Su Linux il concetto stesso di file si ricollega a diverse informazioni, che includono almeno quanto segue:

  • Nome
  • Tipo di file
  • Dimensione del file
  • Marca temporale
  • Proprietario e gruppo
  • Permessi di accesso

Tutti questi attributi possono essere filtrati attraverso il comando find, accompagnato dai parametri appropriati. Per poter filtrare i risultati di ricerca in base alla dimensione del file, bisogna utilizzare il parametro “-size” seguito da una specifica della dimensione.

Il comando find riportato di seguito restituisce dei file aventi una dimensione di almeno 700 megabytes:

find . -size +700M
N.B.

La possibilità di filtrare i risultati in base alla dimensione è disponibile solo per i file. Per quanto riguarda le directory, non viene memorizzata alcuna informazione riguardo alla dimensione nel sistema dati. Tuttavia, se necessario, la dimensione può essere calcolata ricorsivamente.

Le specifiche delle dimensioniconsistono in un numero seguito da un’unità. Di seguito riportiamo una panoramica delle unità disponibili:

Unità

Spiegazione

c

Bytes

k

Kilobytes

M

Megabytes

G

Gigabytes

b

512-byte blocks

La specifica della dimensione è interpretata come la dimensione esatta del file. Non risulta molto pratico dato che spesso la dimensione esatta di un file cercato non è resa nota. Ciò che è utile in questi casi è la restrizione a un certo intervallo di dimensioni. Per questo scopo, il numero è preceduto da un modificatore opzionale:

Modificatore

Spiegazione

+

Il file è più grande delle dimensioni elencate

-

Il file è più piccolo delle dimensioni elencate

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

find . -size -500M

Il comando seguente fornisce invece dei file le cui dimensioni sono comprese tra i 400 e i 500 megabytes.

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

Oltre a specificare una dimensione esatta o un intervallo di dimensioni, è disponibile 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

Utilizzare 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 panoramica dei parametri di ricerca più utilizzati:

Parametro di ricerca

Spiegazione

-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 modificati solo il giorno precedente alla ricerca, è possibile utilizzare il parametro di ricerca “-mtime” seguito dal valore “1”:

find . -type f -mtime 1

I parametri di ricerca visualizzati contenenti “time” nel nome interpretano il valore seguente come numero di giorni. I parametri contenenti “min” nel nome interpretano invece il valore seguente come numero di minuti.

Così come quando si filtra in base alla dimensione del file, anche in questo caso è possibile limitare il numero di giorni trascorsi in un intervallo. Di nuovo, i segni più e meno sono usati come modificatori:

Modificatore

Spiegazione

+

La marca temporale risale a più giorni di quanto specificato

-

La marca temporale risale a meno giorni di quanto specificato

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

find . -type f -ctime +100

Proprio come quando si filtra in base alla dimensione del file, i parametri di ricerca possono essere combinati per coprire un intervallo. Per trovare i file a cui si è avuto accesso tra i tre e i cinque giorni precedenti il giorno della ricerca, si usa il parametro di ricerca “-atime” due volte, ogni volta con i valori “+2” e “-6”. La combinazione esplicita tramite il parametro “-and” è opzionale:

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

Per trovare dei file che sono stati modificati in un arco di tempo inferiore a 5 minuti dal momento della ricerca, è possibile utilizzare il parametro di ricerca “-mmin” seguito dal valore “-5”:

find . -type f -mmin -5

Utilizzare il comando find di Linux per filtrare i risultati in base al proprietario, gruppo e permessi di accesso

Su Linux, a ogni file viene assegnato un utente che agisce come proprietario. Inoltre, ogni file appartiene 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 riportiamo una panoramica dei parametri di ricerca utilizzati:

Parametro di ricerca

Spiegazione

-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 utilizzare 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’espressione “$(whoami)”. Quest’ultima viene risolta con il nome dell’utente connesso:

find . -user $(whoami)

Per cercare altri file che appartengono al gruppo admin, bisogna utilizzare il parametro di ricerca “-group” seguito dal valore “admin”:

find . -group admin

Oltre al poter filtrare in base a proprietario e gruppo, è anche possibile filtrare in base ai permessi di accesso. Per fare ciò, è necessario utilizzare una terzina di numeri ottali. I valori frequentemente usati sono “644”, “755”, ecc. Il primo numero definisce i permessi di accesso per il proprietario, il secondo per il gruppo, il terzo per gli altri utenti. Ognuno dei tre numeri ottali viene creato sommando i permessi individuali. Potete trovare ulteriori informazioni in merito, nel nostro articolo riguardo l’assegnazione dei permessi delle directory con chmod.

Per trovare dei file completamente accessibili per qualsiasi utente, bisogna utilizzare il parametro “-perm” seguito dal valore “777”:

find . -perm 777

Per trovare dei file completamente accessibili solo per il proprietario, bisogna utilizzare 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 specificati. Per questo, bisogna aggiungere il segno meno come prefisso al numero ottale:

find . -perm -007

Come limitare il livello di ricorsione del comando find di Linux

Normalmente, il comando find di Linux passa ricorsivamente attraverso tutte le sottodirectory. Tuttavia, è spesso utile limitare il livello di ricorsione. Per far ciò, si utilizzano i parametri di ricerca “-maxdepth” e “-mindepth”:

Parametro di ricerca

Spiegazione

-maxdepth

Massimo livello di ricorsione

-mindepth

Minimo livello di ricorsione

Per effettuare una ricerca tra i file più grandi di 50 megabyte, includendo 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 effettuare una ricerca tra i file più grandi di 50 megabyte, includendo 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

Utilizzare il comando find di Linux per trovare e processare i file

Finora ci siamo limitati a trovare dei file su Linux. Tuttavia, molti casi d’uso richiedono l’elaborazione di massa dei file trovati. Scenari comuni includono la riparazione dei permessi di accesso per software basati sul web come WordPress o l’eliminazione di file dopo un attacco hacker. Anche per questi casi, si ricorre al comando find.

Ora, bisognerà considerare 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’esecuzione del comando avviene senza che vi venga richiesto! Inoltre, a seconda dei parametri di ricerca selezionati e del comando dato, l’esecuzione 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 interattiva per l’elaborazione di ogni singolo file trovato:

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

Per precauzione, nei seguenti esempi si limita il livello di ricorsione a una sola sottodirectory tramite “-maxdepth 1”.

N.B.

Fate attenzione ai seguenti esempi. Consigliamo fortemente di creare una cartella personale per provarli. Passate a questa cartella prima di eseguire gli esempi per essere sicuri di non danneggiare il vostro sistema!

Utilizzare il comando find di Linux per regolare l’utente e i gruppi

Per impostare il proprietario e il gruppo di tutti i file e le directory al valore “www-data” sarà necessario usare il seguente comando find con il comando chown:

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

Utilizzare il comando find di Linux per regolare i permessi dei file

Per poter trovare i file con permessi “777” e impostarli a “664” è necessario utilizzare 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 {} \;

Utilizzare il comando find di Linux per eliminare directory e file vuoti

È anche possibile utilizzare il comando find per eliminare i file e le directory trovate. Per precauzione, nei seguenti esempi ciò viene mostrato solo per i file e le directory vuote. Inoltre, invece del parametro “-exec”, viene utilizzato il parametro “-ok” per forzare l’utente ad accettare esplicitamente l’operazione di eliminazione.

Per eliminare tutte le directory Linux vuote, si utilizza il seguente comando find accompagnato dal comando rmdir:

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

Per eliminare tutti i file di Linux vuoti, è invece possibile utilizzare il seguente comando find accompagnato dal comando rm:

find . -type f -maxdepth 1 -empty -ok rm {} \;

Abbiamo una proposta per te:
Web hosting a partire da 1 €/mese!

Dominio gratis
Certificato SSL Wildcard incluso
Assistenza clienti 24/7
A partire da 1 €/mese IVA escl. per un anno,
poi 8 €/ mese IVA escl.