Find

De Viquipèdia
Dreceres ràpides: navegació, cerca

En sistemes operatius semblant a Unix i en alguns altres, find és una aplicació de consola que cerca en un o diversos arbres de directoriss d'un sistema de fitxers, troba fitxers basant-se amb els criteris especificats per l'usuari i aplica l'acció indicada en cada un dels fitxers que ha trobat. Els criteris de cerca poden ser un patró per encaixar-hi el nom del fitxer o un rang de dates de modificació o d'accés que ha de tenir els fitxers a trobar. Per defecte find torna una llista amb tots els fitxers del directori actual.

El programa relacionat locate utilitza un base de dades d'indexs a fitxers obtinguts a partir de find (actualitzada a internvals regulars, típicament fent servir cron) de manera que permet cercar fitxers per nom en tot el sistema de fitxer d'una manera molt més ràpida.

Sintaxi de find[modifica | modifica el codi]

find [-H] [-L] [-P] path... [expression]

Les tres opcions controlem com l'ordre find ha de tractar el [Enllaç simbòlic|enllaços simbòlics]. Per defecte find no segueix mai els enllaços, però també es pot indicar explícitament amb el paràmetre -P. El paràmetre -L fa que find segueixi els enllaços simbòlics. Amb -H només seguirà els enllaços simbòlics mentre es processen el paràmetres de la línia d'ordres. Pot ser que aquests paràmetres no estiguin disponibles en versions antigues de find.

Com a mínim hi ha d'haver-hi un camí abans de l'expressió a cercar. find és capaç d'interpretar comodins de manera interna i les ordres s'han d'escriure amb compte perquè no interfereixi amb l'engloblament de la línia d'ordres.

Els elements de les expressions estan separats per espais i s'avaluen d'esquerre a dreta. Poden contenir elements lògics com I (-a) i O (-o) així com altres predicats més complexos.

La versió GNU de find conté un gran nombre de característiques addicionals fora de les especificacions de POSIX.


Exemples[modifica | modifica el codi]

Des del directori actual[modifica | modifica el codi]

find . -name 'my*'

Cerca en el directori actual (representat per un punt, tot i que en versions modernes es pot ometre) i els seus subdirectoris fitxers i directoris que comencin amb my. Les cometes simples eviten l'engloblament de la consola—sense elles la consola substituiria my* per la llista de tots els fitxers que comencen per my en el directori actual.

Executant find. -name my* en RedHat Linux Version 9 retorna aquest error: find: paths must precede expression. Double quotes find. -name "my*" works fine.

Només fitxers[modifica | modifica el codi]

find . -name "my*" -type f

D'aquesta manera es limita el resultat de la cerca de dalt a un llistat de només fitxers exloent els directoris, fitxers especial, enllaços simbòlics, etc. Igual que abans, my* està dins de dues cometes simples per evitar problemes amb la consola.

Commands[modifica | modifica el codi]

Els dos exemples anteriors mostren una llista de resultats perquè, per defecte, find exectua l'acció '-print'. (Les primeres versions de find no tenien cap acció per defecte i descartava el resultat de la cerca amb el que molts usuaris quedaven confusos.)

find . -name "my*" -type f -ls

Això mostra informació estesa dels fitxers.

Cerca a tots els directoris[modifica | modifica el codi]

find / -name "myfile" -type f -print

Això cerca cada directori del disc dur per un fitxer amb el nom myfile i el mostra per pantalla. Generalment no és bona idea cercar un fitxer d'aquesta manera perquè pot tardar molt de temps; és millor especificar el directori de manera més precisa.

Cerca a tots els directoris excepte un[modifica | modifica el codi]

find / -path excluded_path -prune -o -type f -name myfile -print

Cerca a tots els directoris del disc dur excepte el subarbre excluded_path (que és un camí complet inclosa la / del principi) un fitxer anomenat myfile.

Especifica un directori[modifica | modifica el codi]

find /home/weedly -name "myfile" -type f -print

Cerca un fitxer anomenat myfile al directori /home/weedly, el directori inici de l'usuari weedly. És bona idea especificar el subdirectori més a fons possible de l'arbre per motius d'eficiencia.

Cerca a diversos directoris[modifica | modifica el codi]

find local /tmp -name mydir -type d -print

Cerca un directori anomenat mydir en el subdirectori local sota el directori actual i també en el directori /tmp.

Executa una acció[modifica | modifica el codi]

find /var/ftp/mp3 -name "*.mp3" -type f -exec chmod 644 {} \;

Aquesta ordre canvia els permisos de tots els fitxers que acabin en .mp3 dins del directori /var/ftp/mp3. L'acció s'especifica amb l'opció -exec chmod 644 {} \; com a paràmetre. Per a cada fitxer que acabi en .mp3, s'executa l'ordre chmod 644 {} substituint {} pel nom del fitxer. El punt i com (amb una barra diagonal invertida per evitar que la consola l'interpreti com al caràcter de separador d'ordres) indica el fi de l'ordre. Els permisos 644, que normalment es mostren com a rw-r--r--, donen al propietari permisos per llegir i escriure al fitxer, mentres que la resta d'usuaris només hi poden llegir

Si s'executa en Windows no cal incloure la barra diagonal invertida:

find . -exec grep blah {} ;

Si s'ha d'executar l'ordre per molts resultat és molt més eficint executar-la utilitzant xargs en comptes del paràmetre -exec. xargs és molt més modern i és disenyat per aceptar llistes llarges d'una manera molt més intel·ligent. Es pot fer servir l'opció print0 per passar la llista a xargs sense tenir problemes amb fitxers que tenen espais al nom. Per exemple:

find . -print0 | xargs -0 COMMAND

La llista de fitxers generats per find s'encadenen simultàniament mentre s'estan generant cap a xargs qui executa COMMAND amb els fitxers que ha rebut com a paràmetres