Cosa fa#
Cerca file e directory nel filesystem in base a criteri specifici (nome, dimensione, permessi, utente). È uno strumento ricorsivo per natura, fondamentale per l'analisi del sistema e la ricerca di artefatti.
Sintassi#
find [percorso] [espressione/criteri]
Comandi essenziali#
| Comando | Flag | Significato flag | Cosa fa |
|---|---|---|---|
find . -name "test.txt" | -name | Name (nome) | Cerca per nome esatto nella cartella attuale. |
find / -user bandit7 | -user | User (utente) | Cerca file di proprietà dell'utente "bandit7". |
find / -group bandit6 | -group | Group (gruppo) | Cerca file appartenenti al gruppo "bandit6". |
find . -size 1033c | -size | Size (dimensione) | Cerca file di dimensione esatta (c = byte). |
find . -type f | -type f | Type File | Filtra solo i file (esclude le directory). |
find . -xtype l | -xtype l | Extended Type Link | Trova specificamente i link simbolici corrotti. |
find . ! -executable | ! | Not (negazione) | Cerca file che non sono eseguibili. |
find . -inum 12345 | -inum | Inode Number | Cerca il file che possiede quel numero di Inode specifico. |
Tipi di file (-type)#
| Tipo | Descrizione |
|---|---|
f | File regolare |
d | Directory |
l | Link simbolico |
b | Block device (es. disco) |
c | Character device (es. terminale) |
Unità di dimensione (-size)#
| Carattere | Unità |
|---|---|
c | byte |
k | kilobyte (1024 byte) |
M | megabyte |
G | gigabyte |
b | blocchi da 512 byte (default se non specificato) |
find ~ -size +1M # file piu' grandi di 1MB
find ~ -size -100k # file piu' piccoli di 100KB
find ~ -size 1033c # file di esattamente 1033 byteFlag temporali#
| Flag | Cosa cerca |
|---|---|
-mmin n | modificato esattamente n minuti fa |
-mtime n | modificato n*24 ore fa |
-cmin n | contenuto O attributi modificati n minuti fa |
-ctime n | contenuto O attributi modificati n*24 ore fa |
-newer file | piu' recente del file specificato |
-newermt "data" | modificato dopo questa data (formato YYYY-MM-DD) |
-empty | file o directory vuoti |
# File modificati nelle ultime 24 ore
find /etc -mtime -1
# Tutti i file modificati nelle ultime 2 ore dalla dir corrente
find . -type f -mmin -120
# File modificati negli ultimi 10 minuti mmin sta per modification minutes
find /tmp -mmin -10
# File in un range di date
find /var/log -newermt "2026-03-01" ! -newermt "2026-03-28"Operatori logici#
| Operatore | Abbreviazione | Significato |
|---|---|---|
-and | -a | entrambe le condizioni vere (default implicito) |
-or | -o | almeno una condizione vera |
-not | ! | condizione falsa |
\( \) | — | raggruppamento — cambia la precedenza |
# File regolari senza permesso 0600 OPPURE directory senza permesso 0700
find ~ \( -type f -not -perm 0600 \) -or \( -type d -not -perm 0700 \)
# Tutti i file .jpg O .png piu' grandi di 1MB
find ~ \( -name "*.jpg" -o -name "*.png" \) -size +1M
# File di root che NON sono eseguibili
find /usr -user root -not -executable -type fLe parentesi \( \) devono essere escaped con backslash perche' la shell le usa per altro. Devono avere uno spazio prima e dopo.
Azioni predefinite#
| Azione | Cosa fa |
|---|---|
-print | Stampa il path (default — implicita se non specifichi altro) |
-ls | Esegue ls -dils su ogni file trovato |
-delete | Cancella il file trovato |
-quit | Si ferma al primo match |
# Trova e mostra dettagli stile ls
find /tmp -type f -ls
# Trova e cancella file vuoti
find /tmp -empty -type f -delete-exec — eseguire comandi sui risultati#
-exec permette di eseguire qualsiasi comando su ogni file trovato.
find percorso criteri -exec comando {} \;
# ^ ^
# | terminatore del comando (escaped)
# placeholder — sostituito con il path del file{} NON è brace expansion della shell — è un placeholder specifico di find. La shell non lo tocca perche' e' passato come argomento. Find lo sostituisce internamente con il path di ogni file trovato.
# Esegui 'file' su ogni risultato per vedere il tipo
find . -type f -exec file {} \;
# Cancella ogni file trovato (equivalente a -delete)
find /tmp -name "*.tmp" -exec rm '{}' ';'
# Cambia permessi su tutti i file trovati
find ~ -type f -exec chmod 644 {} \;
# Differenza tra \; e +
find . -name "*.log" -exec ls -l {} \; # esegue ls una volta per file
find . -name "*.log" -exec ls -l {} + # passa tutti i file a ls in un colpo solo — piu' velocexargs — alternativa a -exec per pipeline#
xargs prende stdin e lo converte in argomenti per un comando. Piu' efficiente di -exec con \; perche' esegue il comando una volta sola con tutti i file.
# Equivalente a -exec ls -l {} +
find ~ -type f -name 'foo*' | xargs ls -l
# Conta le righe di tutti i file .py
find . -name "*.py" | xargs wc -l
# Cancella tutti i file .tmp
find /tmp -name "*.tmp" | xargs rm
# Attenzione: se i nomi hanno spazi, usa -print0 + xargs -0
find . -name "*.txt" -print0 | xargs -0 rm-print0 e xargs -0 usano il carattere null invece del newline come separatore — gestisce correttamente nomi di file con spazi.
Prende solo i file in un range di date#
find /var/log -newermt "2026-03-01" ! -newermt "2026-03-11"-newermt = newer modification time — file modificati dopo quella data. ! = negazione — esclude quelli dopo la data finale.
trova tutte le immagini
find . \( -name "*.png" -o -name "*.jpg" -o -name "*.jpeg" \) -printQuelli che hanno crittografia nel nome file
find /Users/barno/Documents/lavori/corsobitcoin/content/posts/ -iname "*crittografia*"Spiegazione dei parametri:#
find .: Cerca nella cartella corrente e in tutte le sottocartelle.\(e\): Raggruppano le opzioni (indispensabili quando usi l'operatore OR).-name "*.png": Cerca i file che finiscono per .png.-o: Operatore logico "OR" (O).-name "*.jpg"e-name "*.jpeg": Aggiunge anche le varianti delle immagini JP
Combinazioni utili#
# Trova file di 1033 byte, non eseguibili, del gruppo bandit6
find / -group bandit6 -size 1033c ! -executable 2>/dev/null
# Trova tutti i link rotti e mostrali in formato esteso
find . -xtype l -exec ls -l {} +Analisi Avanzata (Exec)#
Il vero potere di find risiede nella capacità di eseguire azioni sui file trovati:
# Esegue il comando 'file' su ogni oggetto trovato per determinarne il tipo
find . -type f -exec file {} +{}: Segnaposto per il file trovato.+: Concatena i risultati per velocizzare l'esecuzione.
#cambia il gruppo a barno per tutti i gruppi id 1001. se ci sono errori non li stampa a visro
sudo find / -gid 1001 -exec chgrp barno {} \; 2>/dev/nullGestione Errori (Silenziare l'output)#
In ambito Blue Team, quando cerchi dalla root (/) come utente non privilegiato, vedrai migliaia di errori "Permission denied". Puliamo l'output così:
find / -user bandit7 -group bandit6 2>/dev/nullScenario Reale#
Durante un'attività di Incindent Response, devi trovare tutti i file modificati negli ultimi 2 giorni nella cartella /etc per vedere se un attaccante ha alterato le configurazioni:
find /etc -type f -mtime -2
In un'investigation post-compromissione, per trovare file modificati nelle ultime 2 ore escludendo filesystem virtuali che generano rumore:
find / -mmin -120 -type f \
! -path "/proc/*" \
! -path "/sys/*" \
! -path "/dev/*" \
2>/dev/nullSenza escludere /proc, /sys, /dev il risultato e' inutilizzabile (centinaia di migliaia di file). -mmin -120 e' preferibile a -newer /tmp quando si conosce il timestamp dell'attacco.
Durante un'analisi post-incidente, un analista deve trovare tutti i file creati o modificati nelle ultime 24 ore che appartengono a un utente sospetto. Userebbe find / -user sospetto -mtime -1.
Dove l'ho usato#
- bandit-05 — Ricerca per dimensione specifica e permessi.
- bandit-06 — Ricerca globale filtrata per utente e gruppo proprietario.
Note personali#
Ricorda: Il flag
-sizeè molto pignolo.1033ccerca esattamente 1033 byte, mentre+1033ccerca file più grandi e-1033cfile più piccoli.
Collegato a#
- system — categoria (Hub)
- standard-streams — concetto (per l'uso di
2>/dev/null). - grep — spesso usato in pipe per filtrare il contenuto dei file trovati
- broken-links — per la ricerca di link orfani



