Buscar archivos en linux (find)

Imagen de banyut
0 puntos

 

extraido de: http://banyut.obolog.com

 

La instrucción find tiene dos partes.

find [camino...] [expresión]

Camino es la ruta o rutas a partir de la cual empezara las búsquedas, puede ser una o más de una.

find ./PDF/ ./xarxa/ -iname "*.pdf"

Todos los pdf que hay en los directorios PDF y xarxa.

La parte de expresión empezara en el momento en que se encuentre uno de estos caracteres

“-” “(“ “)” “,” “!”

 

La mejor manera de entenderlo son con ejemplos

Búsqueda de un archivo.

find . -name “*.txt”

Nos devolverá todos los archivos con extensión txt que haya en el directorio y recursivamente en todos sus subdirectorios.

El comando find distingue entre mayúsculas y minúsculas, así la instrucción anterior no nos devolverá los ficheros que acaben en TXT. Para que no distinga entre mayúsculas y minúsculas tenemos la opción -iname.

find . -iname “*.txt”

Podemos ejecutar ordenes que afectaran a los ficheros encontrados.

	find . -name "*.bak" -exec rm {} \; 

Esta instrucción borraría todos los ficheros acabados en .bak, esto lo hace a través de la opción -exec acompañada de la instrucción a ejecutar, los corchetes {} se refieren a los ficheros que la instrucción find ha encontrado y la barra invertida \; indica el final de la instrucción.

find . -type d -exec ls {} \;

Otro ejemplo de este uso, lista el contenido de todos los directorios y subdirectorios de la ruta actual.

find ~/confidencial/* -type f -exec md5 {} >> MD5 \;

 

Nos busca todos los ficheros del directorio indicado “~/confidencial/*” y a cada uno le aplica la instrucción md5, guardando el resultado en un archivo llamado MD5.

También podemos hacer búsquedas condicionadas.

find . ! -iname “*.pdf” ! -name “*.jpg”

Que nos devuelve todos los archivos menos los acabados en .pdf o .jpg.

find . ! -iname “*a*” -iname “*.jpg”

Nos devolvería todos los jpg que no tengan en su nombre la letra “a”.

Find, por defecto omite los enlaces (links), si queremos que la búsqueda siga los enlaces tendremos que añadir la opción -follow.

find . -follow -name “*empresa*”

Tenemos que tener en cuenta que podemos caer en una especie de bucle, en el que los links nos hagan volver a pasar por un mismo directorio por el que ya hemos pasado.

Una opción que nos puede ayudar a evitar eso, es -maxdepth n, la que indicamos el número máximo de niveles a los que queremos que find llegue.

find .-follow -maxdepth 5 -name “*empresa*”

Las comparaciones numéricas se especifican como.

  • +n...............mayor que n

  • -n...............menor que n

  • n...............exactamente n

 

veámoslo.

ficheros a los que se ha accedido por última vez en los últimos 10 minutos.

find . -amin -10

ficheros a los que se accedidó, por última vez, hace un año exactamente.

find . -atime 365

ficheros de tamaño superior a 1000 kb

find . -size +1000k

ficheros vacios.

find . -empty

find . -empty -type f

También podemos buscar por tipos.

buscar ficheros

find . -type f

buscar directorios

find . -type d

buscar enlaces simbólicos.

find . -type l

O también por los permisos que tengan concedidos o grupo al que pertenezcan.

buscar ficheros del grupo admin

find . -group admin

ficheros del usuario pepe

find . -user pepe

ficheros que no pertenezcan a ningún grupo o ningún usuario.

find . -nogroup

find . -nouser

ficheros que tengan todos los permisos concedidos para todos

find . -perm 777

Sobre los resultados de find se pueden ejecutar ciertas acciones, esto se hace indicándolo con -exec orden. la cadena {} se reemplazará por el nombre del fichero que se esta procesando.

find . -iname "*.html" -exec cat {} \;

 

Si substituimos -exec por -ok orden, tendrá el mismo efecto pero esta vez nos pedirá confirmación antes de ejecutar la orden.

find . -iname "*.html" -ok cat {} \;

Todas las expresiones que aquí se han mostrado y muchas más que hay disponibles (consultar man find), se pueden combinar entre ellas.

se han de cumplir las dos expresiones (and implícito)

expr1 expr2

Solo se ha de cumplir una de ellas

expr1 -or expr2

Si no se cumple la expr1

! expr1

si no se cumple la expr1 y se cumple expr2

! expr1 expr2

Copia todas las imágenes jpg o png del directorio Imágenes al directorio dibuix.

find ./Imágenes/* -iname "*.jpg" -or -iname "*.png" -exec cp {} tmp/dibuix \;

Ponemos en minúsculas todas las letras de los ficheros.

	find -type f -exec rename 'tr/A-Z/a-z/' "{}" \;

Por último, este comando muchas veces nos devuelve una cantidad de errores que en la mayoría de los casos nos impiden poder ver los resultados. Para evitarlos lo que se hace es redireccionarlos hacia la papelera del sistema.

Si queremos buscar un fichero en todo el ordenador, haremos lo siguiente.

find / -iname nom_fichero

Esto nos devolvería una cantidad de avisos de permiso denegado, la forma de evitarlo es la siguiente.

find / -iname nom_fichero 2>/dev/null

Los errores (2) los redireccionamos (>) al vacío (/dev/null)

Bueno, las posibilidades son múltiples, solo tenéis que echarle un poco de imaginación.