il comando “find”

Il comando find è uno dei più in utilizzati in ambito *unix* per ‘cercare’ nelle directory del sistema.
La sintassi è molto semplice: find dove_cercare espressione

Le espressioni da poter utilizzare sono tante

-name il valore deve essere racchiuso da ” se si utilizzano wildcards *
-type esempio f=file d=directory l=link
-user name o UID
-group name o GID
-perm specifica i permessi
-size per tagli di 512 byte block oppure utilizza c per specificare i bytes
-atime ultima data di lettura
-ctime ultima data di variazione o cambio di permessi
-mtime ultima data di modifica
-newer trova files più recenti
-delete rimuove i files trovati
-ls fornisce un output identico al “ls -dgils"
-print visualizza il risultato del comando find
-exec command {} ; opzione per eseguire un comando; notare la sintassi
-ok usato con exec viene richiesto il consenso prima di eseguire il comando
-depth inizia al più basso livello della directory, piuttosto che di una data directory
-prune utilizzato per escludere alcune directory

Facciamo alcuni semplici esempi:

find . -print – find (il comando) . (il punto indica di ricercare nella dir in cui ci si trova) -print (visualizza) il risultato

in questo modo, vi elencherà i files e le subdirectory presenti nella vostra directory, se omettete il parametro -print in FreeBSD, otterrette lo stesso risultato, perchè si presume che si abbia dimenticato di immetere il parametro, comunque è sempre bene utilizzare il parametro -print perchè non sempre si lavora su un so FreeBSD.

Digitando il comando cd la shell ci riporta nella nostra home directory, a questo punto facciamo alcuni test, creiamo un file vuoto con il comando touch

$ cd
$ pwd
$/home/xer
$ touch myfile

adesso proviamo a fare una ricerca più accurata con il nostro comando find

$ find . -name myfile -print
$./myfile
$

come vedete, la ricerca è andata a buon fine e mi viene visualizzato il file da me ricercato, facciamo un ricerca più ampia, se ad esempio stiamo cercando alcuni files pdf presenti nella nostra home dir, per agevolarci, possiamo utilizzare la wildcard (*) e restringere la sintassi con l’estensione, facciamo una prova, ricordatevi che con il punto . indichiamo di effettuare la ricerca solo nella dir e nelle sub dir in essa presenti ed in cui ci troviamo

$find . -name “*.pdf” -print
$./pdfs/50130201a.pdf
$./pdfs/50130201b.pdf
$./2000_ports.pdf

come vedete ha trovato dei pdf nella sub dir /pdfs ed un file fuori da detta sub dir, notate bene però la sintassi di ricerca, la wildcard * associata all’estensione *.pdf va racchiusa o per meglio dire quotata tra apici “*.pdf” per far si che il comando funzioni, ad ogni modo la corretta sintassi può essere scritta anche così:

$find . -name “*.pdf” -print
$find . -name ‘*.pdf’ -print
$find . -name *.pdf -print

ok, adesso facciamo qualcosa di più complicato, commentiamolo passo per passo

$find . -name “*.pdf” -print
$./pdfs/50130201a.pdf
$./pdfs/50130201b.pdf
$./2000_ports.pdf

abbiamo ripetuto il comando precedente, ebbene scopriamo che un file pdf non è nella nostra sub directory preferita (/pdfs) proviamo ad eseguire un comando aggiuntivo, grep

$find . -name “*.pdf” -print | grep -v “^./pdfs/”
$./2000_ports.pdf

abbiamo aggiunto il pipe (|) per permettere l’uso del grep, lo switch -v indica un filtro in reverse, ciò significa che dovrà produrre l’inverso dell’output desiderato indicato da “^./pdfs/”
abbiamo prima di tutto quotato con gli apici ” il valore espresso, il caret ^ ci aiuta per ricercare utilizzando solo l’inzio del testo da noi espresso, il backslash ci aiuta a non interpretare il punto . come un comando particolare, ed infine abbiamo descritto la directory /pdfs/, gli abbiamo detto insomma, di ricercare tutti i nostri pdf, ma di non produrre e di non visualizzare nel risultato della nostra ricerca i pdf trovati dentro la sub dir /pdfs/ (ricordate lo switch -v del grep?), ma di visualizzare solo i pdf rimasti all’esterno della subdir /pdfs/ ed eccolo:

$./2000_ports.pdf

l’unico files sfuggito al nostro catalogo /pdfs, ok adesso dovremo spostarlo nella directory di competenza, /pdfs, proviamo a fare tutto con una singola espressione:

$find . -name “*.pdf” -print | grep -v “^./pdfs/” | xargs -J X mv X ./pdfs/

abbiamo aggiunto un altro pipe (|) ed abbiamo aggiunto un altro comando oltre al grep il comando xarg, lo switch -J dice al comando xarg di prendere in carico l’output generato dal find usato con il grep e di spostarne il risultato con il comando mv nella sua directory di competenza /pdfs/, per far si che il comando mv funzioni è stato racchiuso da un carattere di mia scelta X.

Rieseguendo il comando find potremmo verificare se l’spressione complessa ha funzionato:

$find . -name “*.pdf” -print
$./pdfs/50130201a.pdf
$./pdfs/50130201b.pdf
$./pdfs/2000_ports.pdf

come vedete il file è stato spostato, certo per un solo file questo comando è un pò complesso, ma se si hanno migliaia di files, questo tipo di espressione potrà esservi molto utile.

Il comando find e relative wildcards possono essere utilizzate per ricercare anche files senza estensioni o parti del nome di file, per esempio vorremmo cercare tutti i files che contengono nel loro nome “bsd”, proviamo subito, questa volta posizioniamoci dal livello più basso dell’albero (/)

$ cd ..
$ pwd
$/
$ find . -name “*bsd*” -print
./usr/bin/bsdiff
./usr/bin/bsdtar
./usr/include/netinet/sctp_os_bsd.h
./usr/include/security/mac_bsdextended
./usr/include/security/mac_bsdextended/mac_bsdextended.h

proviamo a ricercare files che non sono stati letti per più di 20 giorni

$ find . -atime +20 -print

ricerchiamo i files che sono stati modificati nelle ultime 24 ore (1 giorno), per dimostrare che il comando funziona, creiamo subito un file vuoto chiamato tipo

$ cd
$ touch tipo
$ find . -mtime -1 -print
.
./tipo

un altro comando può essere utilizzando alcuni switch in più il confronto con altri files, per esempio, vorrei vedere quali files che iniziano con . sono stati modificati dopo avere modificato il mio file .cshrc pertanto files + nuovi di .cshrc, utilizzeremo lo switch -newer

$ pwd
/home/xer
$ find . -type f -name “.*” -newer .cshrc -print
./.rtorrent.rc

come vedete, il risultato visualizza il file trovato in .rtorrent (si uso rtorrent ;-0 ), infatti è più nuovo come data di .cshrc

cerchiamo un file al quale abbiamo avuto accesso più di 3 giorni fa ed è di dimensioni superiori a 10 mb

$ pwd
/home/xer
$ find . -atime +3 -size +20480 -print
$ ./7.2-RELEASE-i386-disc1/7.2-RELEASE-i386-disc1.iso

e si, meno di tre giorni fa ho scaricato una iso di FreeBSD tramite rtorrent.. 😉

aggiungiamo lo switch -o (or) significa, cercami tutti i files ai quali ho avuto acceso negli ultimi 3 giorni oppure che siano più grandi di 10 mb, proviamo

$ pwd
/home/xer
$ find . -atime +3 -o -size +20480 -print
./7.2-RELEASE-i386-all/7.2-RELEASE-i386-bootonly.iso
./7.2-RELEASE-i386-all/7.2-RELEASE-i386-disc1.iso
./7.2-RELEASE-i386-all/7.2-RELEASE-i386-disc2.iso
./7.2-RELEASE-i386-all/7.2-RELEASE-i386-disc3.iso
./7.2-RELEASE-i386-all/7.2-RELEASE-i386-docs.iso
./7.2-RELEASE-i386-all/7.2-RELEASE-i386-dvd1.iso
./7.2-RELEASE-i386-all/7.2-RELEASE-i386-livefs.iso
./7.2-RELEASE-i386-disc1/7.2-RELEASE-i386-disc1.iso
./7.2-RELEASE-i386-disc2/7.2-RELEASE-i386-disc2.iso
./7.2-RELEASE-i386-disc3/7.2-RELEASE-i386-disc3.iso
$

whoa! come vedete mi ha visualizzato anche i files ai quali ho avuto accesso più di tre giorni fa, ma soddisfano il parametro -o (or) oppure che superino i 10 mb.

Concludendo, giocando con gli switches si possono ottenere una molteplice serie di risultati, in questo modo si raggiunge una buona capacità di utilizzo della vostra shell.

fonte: O’Reilly

Se vuoi sostenerci, puoi farlo acquistando qualsiasi cosa dai diversi link di affiliazione che abbiamo nel nostro sito o partendo da qui oppure alcune di queste distribuzioni GNU/Linux che sono disponibili sul nostro negozio online, quelle mancanti possono essere comunque richieste, e su cui trovi anche PC, NAS e il ns ServerOne. Se ti senti generoso, puoi anche donarmi solo 1€ o più se vuoi con PayPal e aiutarmi a continuare a pubblicare più contenuti come questo. Grazie!

Hai dubbi o problemi? Ti aiutiamo noi!

Se vuoi rimanere sempre aggiornato, iscriviti al nostro canale Telegram.
Se vuoi ricevere supporto per qualsiasi dubbio o problema, iscriviti alla nostra community Facebook o gruppo Telegram.
Cosa ne pensi? Fateci sapere i vostri pensieri nei commenti qui sotto.
Ti piace quello che leggi? Per favore condividilo con gli altri.
Amazon Music
Scopri le ultime offerte per dischi ssd su Acquista su Amazon
Scopri le ultime offerte per memorie RAM DDR su Acquista su Amazon
Scopri le ultime offerte per Chromebook su Acquista su Amazon
Scopri le ultime offerte per Raspberry su Acquista su Amazon

Potrebbero interessarti anche...

Lascia un commento

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

Questo sito usa Akismet per ridurre lo spam. Scopri come i tuoi dati vengono elaborati.