Introduzione

Il comando find è uno degli strumenti più potenti nell'arsenale degli amministratori di sistema di Linux. Cerca file e cartelle (directory) in una gerarchia di directory in base a un'espressione data dall'utente e può eseguire azioni specificate dall'utente su ciascun file corrispondente.

È possibile utilizzare il comando find per cercare file e directory in base a autorizzazioni, tipo, data, proprietà, dimensioni e altro. Può anche essere usato in combinazione con altri strumenti come grep o sed.

Sintassi del comando Find

La sintassi generale per il comando find è la seguente:

find [options] [path...] [expression]
  • L'attributo options controlla il trattamento dei collegamenti simbolici, delle opzioni di debug e del metodo di ottimizzazione.
  • L'attributo path... definisce la directory o le directory di partenza in cui find cercherà i file.
  • L'attributo expression è composto da opzioni, modelli di ricerca e azioni separati da operatori.

Per cercare i file in una directory, l'utente che richiama il comando find deve disporre delle autorizzazioni di lettura per quella directory.

Diamo un'occhiata al seguente esempio:

find -L /var/www -name "*.js"
  • L'opzione -L (options) indica al comando find di seguire collegamenti simbolici.
  • /var/www (path...) specifica la directory che verrà cercata.
  • L'espressione (expression) -name "*.js indica al comando find di cercare i file che terminano con .js (file JavaScript).

Trovare file per nome

La ricerca di file per nome è probabilmente l'uso più comune del comando find. Per trovare un file usando il suo nome, l'opzione -name seguita dal nome del file che stai cercando.

Ad esempio, per cercare un file denominato document.pdf nella directory /home/noviello è necessario utilizzare il comando seguente:

find /home/noviello -type f -name document.pdf

Per eseguire una ricerca senza distinzione tra maiuscole e minuscole, sostituire l'opzione -name con -iname:

find /home/noviello -type f -iname document.pdf

Il comando sopra corrisponderà a "Document.pdf", "DOCUMENT.pdf" ..etc.

Trovare file per estensione

La ricerca di file per estensione equivale alla ricerca di file per nome. Ad esempio, per trovare tutti i file che terminano con .log.gz all'interno della directory /var/log/nginx puoi usare:

find /var/log/nginx -type f -name '*.log.gz'

È importante ricordare che quando si utilizza il carattere wildcard, è necessario citare il modello o fare l'escape al simbolo dell'asterisco *  con una barra rovesciata \ in modo che non venga interpretato dalla shell.

Per trovare tutti i file che non corrispondono alla regex *.log.gz puoi usare l'opzione -not. Ad esempio, per trovare tutti i file che non finiscono in *.log.gz useresti:

find /var/log/nginx -type f -not -name '*.log.gz'

Trovare file per tipo

A volte potrebbe essere necessario cercare tipi di file specifici come file normali, directory o collegamenti simbolici. In Linux, tutto è un file.

Per cercare i file in base al loro tipo, utilizzare l'opzione -type e uno dei seguenti descrittori per specificare il tipo di file:

  • f: un file normale
  • d: directory
  • l: collegamento simbolico
  • c: dispositivi di carattere
  • b: dispositivi di blocco
  • p: named pipe (FIFO)
  • s: socket

Ad esempio, per trovare tutte le directory nella directory di lavoro corrente, utilizzare:

find . -type d

L'esempio comune sarebbe quello di modificare in modo ricorsivo le autorizzazioni del file del sito Web a 644 e le autorizzazioni della directory a 755 utilizzando il comando chmod:

find /var/www/my_website -type d -exec chmod 0755 {} \;

Trovare file per dimensione

Per trovare i file in base alla dimensione del file, passare il parametro -size insieme ai criteri di dimensione. È possibile utilizzare i seguenti suffissi per specificare la dimensione del file:

  • b: Blocchi da 512 byte (impostazione predefinita)
  • c: byte
  • w: parole a due byte
  • k: Kilobyte
  • M: Megabyte
  • G: Gigabyte

Il seguente comando troverà tutti i file di esattamente 1024 byte all'interno della directory /tmp:

find /tmp -type f -size 1024c

Il comando find consente inoltre di cercare file di dimensioni maggiori o inferiori a una dimensione specificata.

Nel seguente esempio, stiamo cercando tutti i file di dimensioni inferiori a 1MB all'interno della directory di lavoro corrente. Notare il simbolo meno - prima del valore della dimensione:

find . -type f -size -1M

Se si desidera cercare file con dimensioni maggiori di 1MB, è necessario utilizzare il simbolo più +:

find . -type f -size +1M

Puoi anche cercare file all'interno di un intervallo di dimensioni. Il seguente comando troverà tutti i file tra 1 e 2MB:

find . -type f -size +1M -size 21M

Trovare file per data di modifica

Il comando find può anche cercare i file in base all'ultima modifica, all'accesso o al tempo di modifica.

Come per la ricerca per dimensione, utilizzare i simboli più e meno per "maggiore di" o "minore di".

Diciamo che qualche giorno fa hai modificato uno dei file di configurazione di dovecot, ma hai dimenticato quale. Puoi facilmente filtrare tutti i file nella directory /etc/dovecot/conf.d che termina con .conf e sono stati modificati negli ultimi cinque giorni con:

find /etc/dovecot/conf.d -name "*.conf" -mtime 5

Ecco un altro esempio di filtraggio dei file in base alla data di modifica utilizzando l'opzione -daystart. Il comando seguente elencherà tutti i file nella directory /home che sono stati modificati più giorni fa 30:

find /home -mtime +30 -daystart

Trovare file per autorizzazioni

L'opzione -perm consente di cercare file in base alle autorizzazioni dei file.

Ad esempio, per trovare tutti i file con autorizzazioni esattamente 775 all'interno della directory /var/www/html, dovrai utilizzare:

find /var/www/html -perm 644

È possibile aggiungere un prefisso alla modalità numerica con meno - o barra /.

Quando la barra / viene utilizzata come prefisso, almeno una categoria (utente, gruppo o altri) deve avere almeno i rispettivi bit impostati affinché un file corrisponda.

Si consideri il seguente comando di esempio:

find . -perm /444

Il comando sopra abbinerà tutti i file con permessi di lettura impostati per utente, gruppo o altri.

Se si utilizza meno - come prefisso, è necessario impostare il file affinché corrisponda almeno ai bit specificati. Il seguente comando cercherà i file che dispongono dell'autorizzazione in lettura e scrittura per il proprietario e il gruppo e sono leggibili da altri utenti:

find . -perm -664

Trovare file per proprietario

Per trovare file di proprietà di un determinato utente o gruppo, utilizzare le opzioni -user e -group.

Ad esempio, per cercare tutti i file e le directory di proprietà dell'utente noviello, eseguire:

find / -user noviello

Supponiamo che tu voglia trovare tutti i file di proprietà dell'utente www-data e modificare la proprietà dei file corrispondenti da www-data a nginx:

find / -user www-data -type f  -exec chown nginx {} \;

Trovare ed eliminare file

Per eliminare tutti i file corrispondenti, aggiungi l'opzione -delete alla fine dell'espressione della corrispondenza.

Assicurati di utilizzare questa opzione solo quando sei sicuro che il risultato corrisponda ai file che desideri eliminare. È sempre una buona idea stampare i file corrispondenti prima di utilizzare l'opzione -delete.

Ad esempio, per eliminare tutti i file che terminano con .temp dalla directory /var/log/ si utilizzerà:

find /var/log/ -name `*.temp` -delete

Utilizzare l'opzione -delete con estrema cautela. La riga di comando find viene valutata come espressione e se aggiungi l'opzione -delete prima, il comando eliminerà tutto sotto i punti di partenza specificati.

Quando si tratta di directory, con il comando find è possibile eliminare solo le directory vuote come rmdir.

Conclusione

Ti abbiamo mostrato come usare il comando find con varie opzioni e criteri.

Questo articolo dovrebbe darti una comprensione fondamentale di come individuare i file sui tuoi sistemi Linux. Puoi anche visitare la pagina man di find per leggere tutte le altre potenti opzioni.