Press "Enter" to skip to content

Il comando linux find

Il comando linux find serve a filtrare oggetti del filesystem (file e cartelle) in maniera ricorsiva basandosi su un semplice meccanismo di condizioni. Find è compreso nella riga di comando della maggior parte dei sistemi operativi unix e unix-like, si può trovare quindi sia su sistemi operativi linux come ubuntu o debian che nel terminale di mac osx.
L’utilizzo più frequente di find è quello della ricerca di un file o una directory all’interno del filesystem del nostro computer/server. Con l’attributo -exec è possibile cercare i file e eseguire immediatamente un comando specifico su ogni risultato.

Indice

Cercare file in linux per nome o estensione

Con il comando find è possibile utilizzare la riga di comando per cercare file con uno specifico nome o estensione. Possiamo ad esempio cercare tutti i file con estensione .jpg all’interno della cartella /home/user/Immagini con il seguente comando.

find /home/user/Immagini/ -name "*.jpg"
cercare file in linux per nome o estensione - comando linux find
L’output del comando
find /home/user/Immagini/ -name “*.jpg”

Utilizzo più comune del comando find, esempio e sintassi

Il comando find ha generalmente la seguente sintassi:

find <opzioni> path/di/partenza <espressione filtro>
  • Le opzioni sono degli attributi che configurano il l’ottimizzazione e il comportamento del comando find
  • Il path/di/partenza è il path a partire dal quale il comando find inizierà la sua ricerca, andando poi di default ricorsivamente in tutte le cartelle contenute.
  • L’espressione filtro è l’attributo che specifica la condizione da testare per la ricerca

Vediamo un esempio con qualche attributo in più del precedente

find -O3 -L /var/www/ -name "*.html"

In questo esempio abbiamo abilitato il livello di ottimizzazione più alto tramite l’opzione -O3 e abbiamo utilizzato l’opzione -L per istruire il comando find a seguire i link simbolici. Abbiamo poi utilizzato l’espressione -name “*.html” per istruire find a cercare tutti i file con estensione .html all’interno della directory /var/www/.

Esempi di base più comuni

Vediamo ora un po’ di esempi comuni dell’uso del comando linux find.

find . -name informaticappunti.txt

Cerca un file chiamato informaticappunti.txt all’interno della directory corrente e le sue sottodirectory.

find /home/user/Immagini -name *.jpg

Cerca tutti i file con estensione .jpg nella directory /home/user/Immagini e le sue sottodirectory.

find . -type f -empty

Cerca un file vuoto a partire dalla directory corrente

find /home -user utente -mtime -7 -iname ".db"

Cerca nella directory /home tutti i file con estensione .db (cercata ignorando la differenza maiuscole/minuscole), modificati negli ultimi 7 giorni dall’utente chiamato utente.

Opzioni più comuni e ottimizzazione del comando find

Il comportamento predefinito di find è quello di ignorare i link simbolici. Se volete includerli è possibile utilizzare l’opzione -L come abbiamo visto in uno degli esempi precedenti.

Il comando find utilizza delle strategie per cercare di incrementare le prestazioni della ricerca. Esistono 3 diversi livelli di ottimizzazione: -O1, -O2, e -O3. Il comportamento predefinito in caso non specificassimo nulla è quello di -O1, ovvero quello di filtrare prima per nome e poi eseguire i seguenti test. Il livello -O2 parte, al pari del precedente, con la verifica del nome del file, poi procede a testare il tipo di file, e solo alla fine verifica le eventuali condizioni aggiuntive più pesanti. Il livello -O3 lascia a find la possibilità di riordinare i vari test di filtraggio in base a parametri come le risorse richieste e la probabilità che il test passi.

L’opzione -maxdepth X indica al comando find quanto andare in profondità nell’albero delle directory. Se impostiamo ad esempio -maxdepth 1 il comando find cercherà solo all’interno della directory specificata, non entrando ricorsivamente delle sottodirectory.

Se aggiungiamo l’opzione -iname il comando find ignorerà la differenza fra maiuscole e minuscole (ricerca case insensitive), non ci sarà quindi differenza fra img.jpg e img2.JPG se stiamo cercando *.jpg con l’opzione -iname.

L’opzione -not inverte le condizioni, ovvero cercherà tutti i file che non corrispondono alle condizioni che abbiamo indicato.

Possiamo, come abbiamo visto in precedenza, utilizzare l’opzione -type f o -type d per cercare solamente i file (f) o solamente le directory (d).

Cercare file per data di modifica

Come abbiamo visto anche in alcuni esempi precedenti il comando find può essere utilizzato per cercare file per data di modifica. Vediamo alcuni esempi.

find /var/www/ -name "*.html" -mtime 5
find /etc/ -name "*conf" -mtime 1

Il primo esempio ritorna la lista di tutti i file .html che sono stati modificati negli ultimi 5 giorni.
Il secondo invece cerca tutti i file che finiscono con la string conf e sono stati modificati nell’ultimo giorno.

Cercare e processare file con il comando linux find

Con l’opzione -exec è possibile eseguire direttamente dei comandi su ogni file/cartella che viene trovato dal comando find. Vediamo un esempio pratico:

find . -name "rc.conf" -exec chmod o+r '{}' \;

Questo comando cerca nella cartella corrente e nelle sue sottodirectory tutti i file chiamati rc.conf e su ognuno esegue il comando chmod o+r per modificarne i permessi.

Come comportamento predefinito il comando specificato viene eseguito nella directory principale della ricerca. Se volete eseguire il comando definito da -exec nella directory in cui si trova il file stesso è possibile utilizzare l’opzione -execdir al posto di -exec. In questo modo potrete evitare eventuali problemi di sicurezza e di eventuale mancanza di permessi.

Le opzioni -exec e -execdir vengono eseguite senza nessun ulteriore preavviso. Se preferite che find vi chieda una conferma prima di eseguire il comando è possibile utilizzare le opzioni -ok oppure -okdir.

Usare find e grep per cercare file in base al contenuto

Il comando find ci offre la possibilità di cercare file e directory solamente in base al nome e qualche altro metadato. Combinando però i comandi find e grep, è possibile eseguire una ricerca anche nel contenuto di un file invece che solamente nel suo nome.
Vediamo un esempio di questa combinazione di comandi:

find . -type f -exec grep "testo" '{}' \; -print

Questo comando seleziona a partire dalla directory corrente e le sue sottodirectory, tutti i file (opzione -type f) e su questi file esegue il comando grep "testo". I file che soddisfano queste condizioni sono elencati a schermo (tramite l’opzione -print). Le parentesi graffe {} sono un segnaposto indicante di volta in volta il file selezionato dal comando find. Il comando specificato nell’opzione -exec è terminato da un ; che è stato “escapato” con un \ per evitare che la shell lo interpretasse in maniera sbagliata.

Cercare e cancellare file ricorsivamente da riga di comando

Con l’opzione -delete è possibile cancellare tutti i file che vengono trovati dal comando find.
Il risultato di -delete non è reversibile, utilizzatelo quindi solamente quando siete certi che i file trovati siano tutti e soli quelli che volete cancellare. Il metodo migliore è sempre quello di eseguire il comando senza l’opzione -delete per verificare la lista di file che verranno cancellati e solo dopo eseguire di nuovo il comando find aggiungendo alla fine l’opzione -delete.
Vediamo un esempio:

find /var/log/  -name "*.bak" -delete

Questo comando cercherà nella cartella /var/log/ tutti i file che finiscono con .bak e li cancellerà.

Per ulteriori informazioni e opzioni disponibili sul comando find potete consultare la pagina man eseguendo:

man find

Be First to Comment

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *