Laser Office s.a.s di Magnaterra Alessandro & C.

il comando “find”

Posted by xer su 10 maggio 2009


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

Lascia un commento

Inserisci i tuoi dati qui sotto o clicca su un'icona per effettuare l'accesso:

Logo WordPress.com

Stai commentando usando il tuo account WordPress.com. Chiudi sessione / Modifica )

Foto Twitter

Stai commentando usando il tuo account Twitter. Chiudi sessione / Modifica )

Foto di Facebook

Stai commentando usando il tuo account Facebook. Chiudi sessione / Modifica )

Google+ photo

Stai commentando usando il tuo account Google+. Chiudi sessione / Modifica )

Connessione a %s...

 
%d blogger cliccano Mi Piace per questo: