Cercar fitxers a LinuxComandes LinuxLinux

La comanda find a Linux: cercar fitxers per nom, mida, data i permisos



La comanda find cerca fitxers i directoris recorrent l’arbre de directoris en temps real, i els pot filtrar pel nom, el tipus, la mida, la data, el propietari o els permisos. A més, pot fer alguna cosa amb cada resultat: mostrar-lo, esborrar-lo o passar-lo a una altra comanda. És una de les eines més potents (i més usades) de l’administració de sistemes.

Sintaxi

find [on buscar...] [criteris] [accions]
  • On buscar: un o més directoris. Si no n’indiques cap, find fa servir el directori actual (.).
  • Criteris (tests): -name, -type, -size, -mtime… Si en poses diversos, s’han de complir tots (és una I lògica).
  • Acció: què fer amb cada resultat. Si no n’hi poses cap, find fa -print (mostra la ruta).

Posa sempre els patrons entre cometes (-name '*.log'). Si no, el shell expandeix l’asterisc abans que find el vegi i els resultats no són els que esperes.

Criteris més útils

CriteriQuè troba
-name 'patró'Nom que coincideix amb el patró (distingeix majúscules)
-iname 'patró'Igual, però sense distingir majúscules i minúscules
-path 'patró'La ruta sencera coincideix amb el patró
-type f / -type d / -type lFitxers normals / directoris / enllaços simbòlics
-size +1M / -size -10kMés grans d’1 MiB / més petits de 10 KiB (unitats c, k, M, G)
-mtime -7 / -mtime +30Modificats fa menys de 7 dies / fa més de 30
-mmin -60Modificats durant l’última hora
-newer fitxerModificats després que fitxer
-user joan / -group www-dataDel propietari o grup indicat
-perm 644 / -perm -u=x / -perm /o=wPermisos exactes / com a mínim aquests / qualsevol d’aquests
-emptyFitxers o directoris buits
-maxdepth N / -mindepth NLimita quants nivells baixa
-xdevNo entra en altres sistemes de fitxers muntats

Els criteris es poden negar amb ! (o -not) i combinar amb una O amb -o, agrupant amb parèntesis escapats: \( -name '*.jpg' -o -name '*.png' \).

Accions més útils

AccióQuè fa
-printMostra la ruta (acció per defecte)
-print0Mostra les rutes separades per un caràcter nul, per a xargs -0
-printf 'format'Mostra la informació que tu triïs (mida, data, permisos…)
-lsMostra cada resultat com ls -dils
-deleteEsborra els resultats
-exec comanda {} \;Executa la comanda una vegada per cada resultat
-exec comanda {} +Executa la comanda una sola vegada amb molts resultats alhora (més ràpid)
-execdir comanda {} \;Com -exec, però des del directori on és cada fitxer
-ok comanda {} \;Com -exec, però demana confirmació per a cada fitxer

Exemples

Buscar un fitxer pel nom al directori actual i als subdirectoris:

$ find . -name document.txt
./projecte/document.txt

Buscar sense distingir majúscules (troba Informe.TXT, informe.txt…):

find ~/Documents -iname 'informe*.txt'

Llistar només els directoris, sense baixar més d’un nivell:

find /var/www -maxdepth 1 -type d

Fitxers de més d’1 MiB, amb la mida:

$ find . -type f -size +1M -exec du -h {} +
2.0M	./projecte/gran.bin

Fitxers modificats durant els últims 7 dies, amb la data al davant:

find . -type f -mtime -7 -printf '%TY-%Tm-%Td %p\n'

Fitxers d’un usuari concret dins de /home:

find /home -type f -user joan

Fitxers executables pel propietari (qualsevol que tingui la x d’usuari):

find . -type f -perm -u=x

Fitxers que qualsevol pot escriure, un problema de seguretat habitual en servidors web:

find /var/www -type f -perm -o=w

Fotos amb dues extensions possibles:

find . -type f \( -iname '*.jpg' -o -iname '*.png' \)

Directoris buits:

find . -type d -empty

Buscar un text dins de tots els fitxers .conf (amb +, grep s’executa poques vegades i és molt més ràpid que amb \;):

find /etc -name '*.conf' -exec grep -l 'Listen' {} + 2>/dev/null

Esborrar els .log de més de 30 dies. Comprova primer la llista i, quan sigui correcta, afegeix-hi -delete al final:

find /var/tmp/exportacions -type f -name '*.log' -mtime +30
find /var/tmp/exportacions -type f -name '*.log' -mtime +30 -delete

Compte amb…

  • L’ordre importa: find avalua d’esquerra a dreta. find . -delete -name '*.log' esborraria tot abans de mirar el nom. -delete sempre l’últim.
  • Les cometes als patrons: find . -name *.txt funciona per casualitat si al directori actual no hi ha cap .txt, però falla (o busca una altra cosa) si n’hi ha.
  • Els arrodoniments de -size i -mtime: -size -1M només troba fitxers buits, perquè la mida s’arrodoneix cap amunt a MiB (fes servir -size -1024k). I -mtime +1 vol dir «fa com a mínim 2 dies», perquè compta dies sencers.
  • Els errors de permisos: si busques per tot el sistema com a usuari normal, afegeix 2>/dev/null per amagar els Permission denied.
  • -exec rm: per esborrar, -delete és més segur i ràpid que -exec rm {} \;.

Receptes de find al blog

Comandes relacionades

  • locate: cerca instantània per nom, a partir d’una base de dades.
  • grep: buscar text dins dels fitxers.
  • which i whereis: on és una comanda.
  • du: quant ocupen els fitxers que trobes.