Skip to main content
  1. Comandi/

Find

Alessio Barnini
Author
Alessio Barnini
Table of Contents

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
#

ComandoFlagSignificato flagCosa fa
find . -name "test.txt"-nameName (nome)Cerca per nome esatto nella cartella attuale.
find / -user bandit7-userUser (utente)Cerca file di proprietà dell'utente "bandit7".
find / -group bandit6-groupGroup (gruppo)Cerca file appartenenti al gruppo "bandit6".
find . -size 1033c-sizeSize (dimensione)Cerca file di dimensione esatta (c = byte).
find . -type f-type fType FileFiltra solo i file (esclude le directory).
find . -xtype l-xtype lExtended Type LinkTrova specificamente i link simbolici corrotti.
find . ! -executable!Not (negazione)Cerca file che non sono eseguibili.
find . -inum 12345-inumInode NumberCerca il file che possiede quel numero di Inode specifico.

Tipi di file (-type)
#

TipoDescrizione
fFile regolare
dDirectory
lLink simbolico
bBlock device (es. disco)
cCharacter device (es. terminale)

Unità di dimensione (-size)
#

CarattereUnità
cbyte
kkilobyte (1024 byte)
Mmegabyte
Ggigabyte
bblocchi 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 byte

Flag temporali
#

FlagCosa cerca
-mmin nmodificato esattamente n minuti fa
-mtime nmodificato n*24 ore fa
-cmin ncontenuto O attributi modificati n minuti fa
-ctime ncontenuto O attributi modificati n*24 ore fa
-newer filepiu' recente del file specificato
-newermt "data"modificato dopo questa data (formato YYYY-MM-DD)
-emptyfile 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
#

OperatoreAbbreviazioneSignificato
-and-aentrambe le condizioni vere (default implicito)
-or-oalmeno 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 f
Note

Le parentesi \( \) devono essere escaped con backslash perche' la shell le usa per altro. Devono avere uno spazio prima e dopo.


Azioni predefinite
#

AzioneCosa fa
-printStampa il path (default — implicita se non specifichi altro)
-lsEsegue ls -dils su ogni file trovato
-deleteCancella il file trovato
-quitSi 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' veloce

xargs — 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
Tip

-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" \) -print

Quelli 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/null

Gestione 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/null

Scenario 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/null

Senza 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. 1033c cerca esattamente 1033 byte, mentre +1033c cerca file più grandi e -1033c file 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

Related