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
- il video su YouTube
- esempi e comandi della puntata su GitHub
- find(1), pagina di manuale — il manuale completo
- find(1) in italiano — in italiano
- grep(1), pagina di manuale — utile in coppia con find
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!
