>_ Sistemi operativi e Linux

Cercare file e testo su Linux: find, grep e locate

Come trovare file per nome, data e dimensione con find, cercare testo nei file con grep e ripgrep e usare locate per ricerche veloci, con esempi pratici.

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:

  • -r cerca ricorsivamente in tutte le sottocartelle;
  • -i ignora maiuscole e minuscole;
  • -n mostra il numero di riga;
  • -l elenca solo i nomi dei file che contengono il testo;
  • -v inverte, mostrando le righe che non corrispondono;
  • -w cerca solo parole intere, così log non trova blog;
  • -C 3 mostra 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, o rg in 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

  • find cerca per nome, tipo, dimensione, data, proprietario e permessi, e può agire sui risultati.
  • Prima di usare -delete si controlla sempre l'elenco con -print.
  • grep -rn trova un testo in un'intera cartella indicando file e riga.
  • rg è più veloce e comodo per il codice; grep è presente ovunque.
  • locate risponde all'istante ma dipende da un indice da aggiornare con updatedb.
MM
Marco Marzaduri

Marco Marzaduri si occupa di cybersecurity, informatica forense e sviluppo web. Laureato in informatica e in psicologia, unisce l'analisi tecnica alla comprensione del fattore umano.

Leggi anche