Sapere che un file esiste ma non ricordare dove l'hai salvato. Dover trovare in quale delle duecento configurazioni compare un certo indirizzo. Voler sapere quali file sono cambiati nelle ultime ventiquattro ore. Sono domande quotidiane per chiunque lavori con un computer, e su Linux hanno risposte precise grazie a tre strumenti: find cerca i file in base alle loro caratteristiche, grep cerca il testo dentro i file, locate interroga un indice per risposte immediate.
find: cercare in base alle caratteristiche
La struttura di find è sempre la stessa: dove cercare, poi uno o più criteri, eventualmente un'azione.
find /home/anna -name "*.pdf"
cerca tutti i PDF nella cartella di Anna e nelle sottocartelle. Con -iname la ricerca ignora maiuscole e minuscole, quindi trova anche Fattura.PDF. Le virgolette attorno al modello sono importanti: senza, la shell potrebbe espandere *.pdf prima che find lo veda.
I criteri più utili
| Criterio | Esempio | Significato |
|---|---|---|
-type |
-type f, -type d |
solo file o solo cartelle |
-size |
-size +500M |
più grandi di 500 MB |
-mtime |
-mtime -1 |
modificati nelle ultime 24 ore |
-mmin |
-mmin -30 |
modificati negli ultimi 30 minuti |
-newer |
-newer riferimento.txt |
più recenti di un altro file |
-user |
-user www-data |
appartenenti a un utente |
-perm |
-perm -o+w |
scrivibili da chiunque |
-empty |
-empty |
file o cartelle vuoti |
I criteri si combinano: più criteri di seguito valgono come «e», mentre -o significa «oppure». Per esempio, i file più grandi di 1 GB modificati nell'ultima settimana:
find / -type f -size +1G -mtime -7 2>/dev/null
La parte finale 2>/dev/null nasconde i messaggi «permesso negato» per le cartelle che l'utente non può leggere, che altrimenti sommergono i risultati.
Per limitare la profondità della ricerca c'è -maxdepth 2, e per escludere una cartella pesante, come quella delle dipendenze di un progetto, si usa -path ./node_modules -prune -o seguito dal resto dell'espressione.
Agire sui risultati
find può eseguire un comando su ciò che trova. Le forme più sicure:
find . -name "*.log" -mtime +30 -print
find . -name "*.log" -mtime +30 -delete
La regola che seguo sempre: prima lanciare la ricerca con -print e leggere l'elenco, poi sostituire con -delete. Per comandi diversi si usa -exec:
find . -name "*.jpg" -exec ls -lh {} +
Le graffe vengono sostituite dai nomi trovati; il + finale raggruppa molti file in una sola esecuzione, più veloce che lanciare il comando una volta per file.
grep: cercare il testo dentro i file
grep legge file o input e stampa le righe che contengono un modello:
grep "192.168.1.20" /etc/hosts
Le opzioni che servono quasi sempre:
-rcerca ricorsivamente in tutte le sottocartelle;-iignora maiuscole e minuscole;-nmostra il numero di riga;-lelenca solo i nomi dei file che contengono il testo;-vinverte, mostrando le righe che non corrispondono;-wcerca solo parole intere, cosìlognon trovablog;-C 3mostra tre righe di contesto prima e dopo ogni risultato.
Un esempio tipico: trovare in quale file di configurazione viene impostata una porta.
grep -rn "listen 8080" /etc/nginx/
Con -E si usano le espressioni regolari estese. Per esempio, per trovare le righe con un indirizzo email in un file di testo:
grep -Eo "[[:alnum:]._%+-]+@[[:alnum:].-]+\.[a-z]{2,}" contatti.txt
L'opzione -o stampa solo la parte trovata e non l'intera riga. grep funziona benissimo anche in una pipe: ps aux | grep nginx o journalctl -b | grep -i error.
ripgrep: quando i progetti sono grandi
Per cercare nel codice sorgente esiste ripgrep, comando rg, disponibile nei repository delle principali distribuzioni. È ricorsivo per impostazione predefinita, molto veloce e salta da solo i file elencati in .gitignore, i file binari e le cartelle nascoste. rg "funzioneDaCercare" dentro un progetto restituisce subito file e righe, colorati. Per l'uso quotidiano su codice è più comodo di grep -r, ma grep resta lo standard presente su ogni sistema, compresi i server minimali.
locate: ricerche istantanee per nome
find esplora il disco ogni volta, e su un disco grande può richiedere tempo. locate invece consulta un database dei nomi dei file, aggiornato periodicamente:
locate preventivo-2025
La risposta è immediata. Il limite è che il database può non essere aggiornato: un file creato dieci minuti fa potrebbe non comparire. Si aggiorna con sudo updatedb. Su molte distribuzioni il pacchetto si chiama plocate, una versione più recente e veloce.
Quale strumento usare
- Conosco il nome o parte di esso e voglio una risposta rapida:
locate. - Cerco per data, dimensione, proprietario o permessi, oppure devo agire sui file:
find. - Cerco una parola o un valore dentro i file:
grep, orgin un progetto di codice.
Nel mio lavoro, durante un'analisi, la combinazione più utile è proprio quella tra i due: find per isolare i file cambiati in un certo intervallo, e grep per capire che cosa contengono.
In sintesi
findcerca per nome, tipo, dimensione, data, proprietario e permessi, e può agire sui risultati.- Prima di usare
-deletesi controlla sempre l'elenco con-print. grep -rntrova un testo in un'intera cartella indicando file e riga.rgè più veloce e comodo per il codice;grepè presente ovunque.locaterisponde all'istante ma dipende da un indice da aggiornare conupdatedb.