GNU/Linux: trovare i file con find

Se c’è un comando con una sintassi arzigogolata e amplissima, è find. Il nome dice tutto: trova le cose nella vostra Linux box, e lo fa con un sacco di criteri diversi. Oggi vediamo gli usi più frequenti e le basi per capire poi le sintassi più complesse. Per prepararvi gli esempi, createvi una cartella di prova con qualche sottocartella e qualche file: tutti i comandi qui sotto sono sicuri, tranne quelli che cancellano, che agiscono solo su file che create voi.

Cercare per nome

L’uso più comune: cercare i file per nome. Find vuole sapere in quale cartella cercare; il punto significa “la cartella corrente e tutte le sue sottocartelle”. Poi l’opzione -name con il nome del file:

find . -name dir3.txt

Ecco tutte le posizioni in cui si trovano file con quel nome. Posso anche limitare la ricerca a una cartella specifica e alle sue sottocartelle:

find dir4 -name dir3.txt

Nel campo -name si possono usare le wildcard, cioè i caratteri jolly. L’asterisco sta per qualunque sequenza di caratteri: così trovo dir1.txt, dir2.txt, dir3.txt e via dicendo. Le virgolette sono importanti, altrimenti la shell espande l’asterisco prima di passarlo a find:

find . -name "dir*.txt"

Cercare per tipo

L’opzione -type specifica il tipo di oggetto: d per le cartelle, f per i file normali. Ad esempio, solo le cartelle che si chiamano dir3:

find . -type d -name dir3

Per capire meglio, creiamo un file chiamato dir3 dentro la cartella dir1: ha lo stesso nome di diverse cartelle nel nostro albero.

echo prova > dir1/dir3
cat dir1/dir3

Se cerco soltanto per nome ottengo anche dir1/dir3, che però è un file:

find . -name dir3

Con -type f mi viene restituito solo quello, con -type d solo le cartelle:

find . -type f -name dir3
find . -type d -name dir3

Cercare per permessi

L’opzione -perm seleziona i file in base ai permessi. Se non vi ricordate come funzionano i permessi in Linux, riprendete la puntata dedicata: qui non c’è spazio per rispiegarli. Diamo ai nostri file permessi diversi:

chmod 775 dir3.txt
chmod 644 dir1.txt
chmod 600 dir2.txt

e cerchiamo quelli con permessi 775. Aggiungo -type f perché le cartelle appena create hanno spesso proprio quei permessi e comparirebbero anch’esse:

find . -type f -perm 775

Mi viene restituito solo dir3.txt, l’unico con quei permessi. Se ora cambio anche i permessi di dir2.txt e ripeto la ricerca, compare anche lui:

chmod 775 dir2.txt
find . -type f -perm 775

Eseguire azioni con -exec

Find non si limita a trovare i file: può anche eseguire azioni su quelli che trova. Se devo cambiare i permessi di due file lo faccio a mano, ma se sono centinaia diventa un lavoro tedioso. Per questo c’è -exec. La sintassi è facile da ricordare: scrivete una normale riga di comando, mettete le parentesi graffe {} al posto del nome del file trovato, e terminate con un punto e virgola, a cui va fatto l’escape con la barra rovesciata.

Trova tutti i file con permessi 775 e per ognuno esegui chmod 665:

find . -type f -perm 775 -exec chmod 665 {} \;

Ha fatto tutto. Se ripeto la ricerca con 775 non trovo niente; con 665 ecco i miei file modificati:

find . -type f -perm 775
find . -type f -perm 665

Una classica applicazione è cancellare. Mettiamo nel mirino dir3.txt: prima guardo cosa trova, poi lo elimino con rm:

find . -name dir3.txt
find . -name dir3.txt -exec rm {} \;
ls

Il file è sparito. Funziona anche con i pattern. Attenzione alle virgolette per il pattern: dimenticarle è un errore da principianti, mi è successo anche nel video!

find . -name "dir*.txt"
find . -name "dir*.txt" -exec rm {} \;

Una regola d’oro: prima lanciate il find senza -exec per vedere cosa trova, e solo poi aggiungete l’azione.

Limitare la profondità

Volendo spostare tutti i file in una sottocartella, c’è un piccolo problema. Creiamo la sottocartella e guardiamo cosa trova la ricerca dei soli file:

mkdir sotto
find . -type f

Trova anche i file che stanno nelle sottocartelle. Per limitare la profondità c’è -maxdepth: con 1 cerca solo nella cartella corrente.

find . -maxdepth 1 -type f

Ora posso usare mv con -exec: grazie a -maxdepth 1 find non scende nella sottocartella, quindi non rimescola quello che ci metto:

find . -maxdepth 1 -type f -exec mv {} sotto/ \;
ls
ls sotto

I file sono spariti dalla cartella corrente: li ho mandati nella sottocartella con mv.

Cercare per data

Un’altra funzione importantissima è la ricerca per data di modifica, con -mtime. Il numero è in giorni: -1 significa “meno di un giorno fa”, cioè i file modificati oggi. Escono sia file sia cartelle:

find . -mtime -1

Lo combino con -type per distinguerli. Solo i file:

find . -mtime -1 -type f

Solo le cartelle:

find . -mtime -1 -type d

È comodo per vedere se ci sono state modifiche recenti in una certa cartella o in un insieme di file.

E il resto?

Le opzioni di find sono tantissime e non mi interessava elencarle, ma mostrarvi la logica di funzionamento. Per il resto, la man page è un ottimo punto di partenza: abituatevi a partire sempre da lì prima di mettervi le mani nei capelli. L’informazione che cercate è quasi sempre lì.

man find

Se vi servono approfondimenti su casi d’uso specifici, scrivetemelo nei commenti.

Link e risorse

Sostieni il canale

PER SOSTENERE IL CANALE BASTANO UN LIKE E UN’ISCRIZIONE!

questi link sono affiliati Amazon, acquistando i libri che ti consiglio sostieni il canale!