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 comandofind
di seguire collegamenti simbolici. /var/www
(path...
) specifica la directory che verrà cercata.- L'espressione (
expression
)-name "*.js
indica al comandofind
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 normaled
: directoryl
: collegamento simbolicoc
: dispositivi di carattereb
: dispositivi di bloccop
: 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 {} \;
find /var/www/my_website -type f -exec chmod 0644 {} \;
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
: bytew
: parole a due bytek
: KilobyteM
: MegabyteG
: 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.