Comando find in Linux: cercare file per nome, dimensione e data

find visita una o più directory e le loro sottodirectory per trovare percorsi che soddisfano condizioni su nome, tipo, dimensione o data di modifica. Può stampare i risultati o passarli a un altro comando; la scelta delle azioni determina se si limita a leggere oppure modifica i file.

Gli esempi si riferiscono a GNU Findutils. Per le prove crea una cartella nuova con mkdir find-demo && cd find-demo e prosegui soltanto se entrambi i comandi riescono. Usa nomi nuovi per i dati dimostrativi. I percorsi /var e /srv/app degli esempi reali possono mancare o richiedere permessi di lettura: sostituiscili con una cartella a cui hai accesso, senza modificare dati di sistema.

Cos'è il comando find?

La riga di comando indica prima i percorsi iniziali e poi un’espressione, composta da test, operatori logici e azioni. Due test affiancati significano normalmente AND: devono essere entrambi veri. La valutazione segue la precedenza degli operatori e si interrompe quando il risultato è già determinato; non significa che ogni azione venga eseguita su ogni file. Senza un’azione che la sostituisca, GNU find applica -print ai risultati. La scansione legge lo stato corrente incontrato durante il percorso, non una fotografia immutabile del filesystem.

Sintassi di base

find [STARTING-POINT]... [EXPRESSION]

STARTING-POINT ed EXPRESSION sono segnaposto. Controlla find --version, find --help e man find: alcune opzioni sono estensioni GNU. Indica esplicitamente il percorso, anche se GNU usa . quando manca; il punto indica la directory corrente. I percorsi con spazi vanno tra virgolette. Per un nome che inizia con un trattino usa ./-cartella o un percorso assoluto: non affidarti a -- per distinguere i percorsi dall’espressione. Le opzioni -H, -L e -P precedono i percorsi.

Uso di base di find

Ricerca per nome

Nella cartella dimostrativa prepara printf 'log\n' > app.log e printf 'nota\n' > note.txt. Il comando seguente trova ./app.log. Gli apici impediscono alla shell di espandere *.log prima della ricerca. -name confronta il solo nome finale, non il percorso completo: per un modello che contiene directory usa -path. -name può trovare anche directory chiamate .log: aggiungi -type f se vuoi solo file normali.

find . -name '*.log'

Filtrare per tipo e dimensione

-type f seleziona i file normali e -size +100M, in GNU find, quelli di dimensione maggiore di 100 mebibyte (MiB), cioè 104857600 byte. Non misura necessariamente lo spazio realmente occupato su disco, per esempio nei file sparsi. Le unità sono arrotondate per eccesso: -size 1M comprende da 1 byte fino a 1 MiB, mentre -size -1M trova solo file vuoti. Per confronti precisi usa il suffisso c, che indica byte. Limita il punto di partenza a una cartella pertinente per evitare una scansione inutile di tutto /var.

find /var -type f -size +100M

Filtrare per data di modifica

Il comando seguente seleziona file modificati negli ultimi 60 minuti, secondo il test -mmin di GNU find. La data di modifica riguarda il contenuto, non la creazione. -mtime usa invece intervalli interi di 24 ore, scartando la parte frazionaria: -mtime 0 indica meno di 24 ore, -mtime 1 da 24 a meno di 48 ore e -mtime +30 almeno 31 periodi completi di 24 ore. Non è un arrotondamento al giorno più vicino né una selezione per data di calendario. Per una prova, un file appena creato nella tua cartella deve soddisfare -mmin -60; uno non modificato da oltre un’ora no.

find /srv/app -type f -mmin -60

Verificare percorso iniziale e risultato

Questa prova crea una directory nuova e un file vuoto, poi cerca il suo nome. Se demo-find esiste già, mkdir si ferma e il blocco non prosegue: scegli un altro nome. Il sottoprocesso mantiene locale l’uscita in caso di errore, senza chiudere la shell da cui lo avvii.

(
  mkdir demo-find || exit 1
  touch demo-find/a.txt || exit 1
  find demo-find -name '*.txt'
)

Esempio di output:

demo-find/a.txt

Il risultato include il percorso iniziale demo-find. Un output diverso può indicare dati già presenti o un’altra directory di lavoro; non usare l’esempio come autorizzazione a cancellare la cartella. Prima di aggiungere -exec o -delete verifica i risultati e il percorso effettivo. Gli errori di accesso vanno letti separatamente dall’elenco: un risultato parziale non prova che l’intera scansione sia riuscita.

Test e opzioni principali di GNU find

Opzione Scopo
-name PATTERN Confronta il nome finale con un modello della shell, distinguendo maiuscole e minuscole.
-iname PATTERN Confronta il nome finale senza distinguere maiuscole e minuscole, secondo il locale.
-type TYPE Seleziona il tipo: f file normale, d directory, l collegamento simbolico; l’effetto dipende anche dalle impostazioni sui collegamenti simbolici.
-maxdepth N Scende al massimo di N livelli: il punto iniziale è al livello 0. Con -maxdepth 1 esamina il punto iniziale e i suoi figli diretti.
-mtime N Verifica l’età della modifica in intervalli interi di 24 ore; +N significa più di N intervalli completi.
-size N Confronta la dimensione con arrotondamento per eccesso all’unità: c byte, k KiB, M MiB. Senza suffisso usa blocchi da 512 byte.
-exec COMMAND {} + Passa più percorsi come argomenti separati a COMMAND. {} deve stare subito prima di +; il comando scelto deve accettare più file.
-delete Elimina subito gli elementi corrispondenti; implica -depth. Va usato solo dopo aver verificato percorso, espressione e conseguenze.

Esempi pratici

Trovare directory vuote

Crea mkdir empty-demo nella cartella dimostrativa. Il comando seguente trova anche questa directory vuota. -empty da solo corrisponde sia a file normali vuoti sia a directory vuote: -type d restringe la ricerca. Anche il punto iniziale può corrispondere; per escluderlo aggiungi -mindepth 1. L’elenco non elimina nulla.

find . -type d -empty -print

Passare i file a un comando senza spezzarne i nomi

Prepara printf 'temporaneo\n' > 'file di prova.tmp'. Nell’esempio, find passa ciascun percorso direttamente come un argomento a ls, anche se contiene spazi; la forma {} + può riunire più file nella stessa esecuzione. Il -- appartiene a ls e termina le sue opzioni: non è la sintassi del punto iniziale di find. La lista di ls può essere quotata o adattata al terminale e non va reinterpretata come un formato di scambio. Per altri comandi verifica opzioni, supporto di più file e stato di uscita. Nomi correttamente separati non rendono sicura qualsiasi operazione in directory che altri utenti possono cambiare.

find . -type f -name '*.tmp' -exec ls -l -- {} +

Esaminare i candidati prima di una cancellazione

Usa una directory cache che conosci e di cui hai verificato il percorso; per la sola prova crea mkdir cache nella cartella dimostrativa, se non esiste. Il blocco seguente stampa soltanto i file normali con -mtime +30. Aggiunge esplicitamente -depth per mantenere l’ordine di visita che -delete attiverebbe. Dopo aver controllato l’elenco, conservato quanto serve e verificato che nessuno stia modificando la directory, la forma di cancellazione è find ./cache -depth -type f -mtime +30 -delete, da eseguire separatamente soltanto se è davvero l’azione desiderata. -mtime +30 significa almeno 31 periodi completi di 24 ore; un file appena creato non compare. La cancellazione non passa dal cestino e non è annullabile con find.

find ./cache -depth -type f -mtime +30 -print

find e comandi correlati

Comando Ruolo principale Quando usarlo
find Visita corrente delle directory Test e azioni dettagliate sui metadati
locate Ricerca in un indice preparato in precedenza Ricerca del nome, con risultati limitati dall’aggiornamento del database
which Ricerca di eseguibili nelle directory di PATH Individuare un comando esterno; alias e funzioni della shell richiedono strumenti come command -v
grep -R Cerca contenuti dei file Trovare schemi di testo

Avvertenze importanti

Proteggere i modelli dall’espansione della shell

Senza apici, *.log può diventare uno o più nomi già nella directory corrente prima che find venga avviato. Con -name '*.log' il modello arriva integro a find. L’ordine dei risultati non è un ordinamento alfabetico garantito. Per elaborare nomi arbitrari non dividere l’output di -print sulle righe: su Linux i nomi possono contenere nuove righe. -print0 separa i nomi con un byte NUL, valore zero, e richiede un programma che accetti quel separatore.

-delete agisce immediatamente

Non mettere -delete prima dei test: verrebbe valutato prima dei filtri previsti. L’azione implica -depth, quindi non va combinata con -prune pensando che la directory esclusa non venga visitata. GNU find usa normalmente -P, che non segue i collegamenti simbolici; -L può ampliare la visita e cambiare -type. -xdev limita la discesa su altri dispositivi, ma non rende innocua una cancellazione. Fra una verifica e l’azione i file possono cambiare: l’elenco precedente non elimina questa possibilità. Per directory condivise o controllate da altri utenti consulta le considerazioni di sicurezza di GNU Findutils, inclusa la scelta fra -exec e -execdir.

Comprendere la precedenza delle espressioni

AND, anche implicito, ha precedenza maggiore di OR (-o). Per esempio find . -type f \( -name '*.log' -o -name '*.txt' \) -print stampa entrambi i tipi di nome, solo se sono file normali. Senza il raggruppamento, -type f o -print possono applicarsi a un solo ramo; una corrispondenza nel primo ramo OR può evitare l’esecuzione dell’azione nel secondo. I backslash proteggono le parentesi dalla shell, mentre le parentesi definiscono il gruppo per find. Prova prima con -print: aggiungere un’azione può anche disattivare la stampa predefinita.

FAQ

Find cerca automaticamente nelle sottodirectory?

Sì, normalmente visita ricorsivamente sotto ciascun punto iniziale. -maxdepth limita la discesa e -mindepth evita di applicare test e azioni ai livelli iniziali. La gestione dei collegamenti e i confini dei filesystem possono cambiare l’insieme visitato.

Come faccio a ignorare le maiuscole/minuscole in una corrispondenza di nome file?

Con GNU usa -iname '*.log'. È un confronto sul nome finale, non sul contenuto; il comportamento dei caratteri e delle maiuscole può dipendere dal locale.

Come gestisco in sicurezza gli spazi?

Usa -exec con argomenti diretti e {} + se il comando accetta più file, oppure -print0 insieme a un consumatore che legga nomi separati da NUL. Evita di incollare i nomi in una stringa da reinterpretare con sh -c: la corretta separazione in argomenti si perderebbe.

Perché find può richiedere più tempo di locate?

Find visita il filesystem corrente, mentre locate consulta un database già costruito. Il tempo dipende da quantità di directory, disco, cache e condizioni; non è garantito che find sia sempre più lento. L’indice di locate può omettere file nuovi o includere nomi ormai rimossi finché non viene aggiornato.

Fonti e documentazione