Comando find en Linux

“¿Cómo encontrar cosas en Linux?”, “¿Cómo buscar en Linux?”, entre otras preguntas, son las que naturalmente nos formularemos tarde o temprano. Sin más preambulos, comencemos a estudiar el comando find.

Primero, lo primero; debes leerte el man page de find.

Bajo circunstancias normales, de haber sido un man page corto, o de tamaño moderado; ciertamente lo hubiese traducido. Pero el tamaño de ese documento dificulta las cosas.

1. Lo básico:

Si ejecutas find sin pasarle ningún paramentro, intentará encontrar todos los directorios y subdirectorios, ficheros, etc., a partir del lugar donde lo ejecutes.

Evidentemente, ejecutarlo sin pasarle parametros no tendría ninguna utilidad, de modo que el primer parametro que deberiamos pasarle, debe ser la ruta donde se ejecutará la busqueda, y el segundo parametro, el nombre del fichero que queremos buscar.

Ejemplo:
Digamos que quiero buscar un fichero llamado pepito.txt , en mi directorio HOME, haría algo como lo siguiente:

# find /home/jespinal/ -name "pepito.txt"

donde /home/jespinal es el nombre de mi directorio HOME, y pepito.txt es el nombre del fichero, el cual encerramos en comillas (“”), esto no es realmente obligatorio (a menos que uses caracteres comodines como ‘*’ o ‘?’, los cuales podrian ser interpretados por la consola como una ruta en donde buscar en vez de algo que forma parte del nombre).
No obstante, es buena practica encerrar el nombre de lo que buscamos en comillas dobles, ya que te permite buscar nombres con espacios de por medio, ej. ‘mi lista.txt’

2. Avanzando un poco

Puede darse el caso donde no sabemos exactamente el nombre del fichero, sino que solo recordamos parte de lo que el nombre conteniene, por ejemplo ‘pep’; y no solo eso, sino que tampoco sabemos donde está ubicado exactamente.

Sencillo, sin importar donde este, obviamente estara en un subdirectorio en algun lugar debajo de nuestro directorio raiz ( / ), asi que empezaremos la busqueda desde ahi. Y ya que no sabemos el nombre exacto del fichero, le daremos a find lo que tenemos (A final de cuentas, quien debe buscar es el, no nosotros :] )

e.g Escribiriamos algo como lo siguiente:

# find / -name "*pep*"

y listo.

Como nota adicional, fijate que delante de ‘pep’ (que eran los unicos caracteres que inicialmente sabiamos que estaban contenidos en el nombre del fichero) he puesto un asterisco ( * ), tambien detras.
El asterisco basicamente significa ‘cualquier cosa’, o ‘cualquier combinacion de texto’.

Estamos diciendole a find que busque, a partir de / (root), algo (ya sea fichero o directorio) cuyo nombre comience con ‘cualquier cosa’ seguida de los caracteres ‘pep’, y que termine con ‘cualquier cosa’.

Dentro de los posibles valores que puede valer el asterisco, esta la posibilidad de que no haya ningun caracter; o sea, si aparece un fichero (o directorio) llamado pepsi.txt, sipep.txt, pep.txt, sopepto.txt, entonces find te lo dira, ya que todos coinciden con el parametro de busqueda que diste para el nombre.

3. Ser más exigente con la busqueda

Recuerda que find va a buscar lo que le digas que busque, de acuerdo a la manera que se lo digas, y será tan preciso en los resultados como tu lo seas en los parámetros que le pasas.

Si le pasas parámetros poco precisos, no esperes que find te traiga solo resultados de lo que tu estabas esperando.

Imagina que quieres ver los ficheros regulares que tienes en tu directorio HOME.
OJO: dije ficheros regulares, no directorios, no symbolic links (vinculos simbolicos), ni tampoco pipes, FICHEROS!

Para eso solo tienes que indicarle a find el tipo, que es ‘f’,

La tabla de posibles tipos de ficheros es la siguiente:

b bloque especial
c caracter especial
d direcotorio
p tuberia (pipe)
f fichero regular
l vínculo simbolico (leete el man page para que veas unas cuantas especificaciones)
s socket
D Puerta (Solaris)

Para el ejemplo previo, tendríamos que ejecutar algo como esto:

# find /home/jespinal -type f

4. Algunos ejemplos prácticos

a. Buscar a partir del directorio raiz todos los ficheros regulares cuyo nombre termine en .log

# find / -type f -name "*.log"

b. Buscar a partir del directorio raíz todos los ficheros terminados en .tmp y eliminarlos

# find / -type f -name "*.tmp" -delete

Ojo: la opción -delete sirve para eliminar los ficheros que find encuentra a partir de los parametros que le damos (cuidado, cualquier error puede ser letal).

c. Encontrar en el directorio actual ( . ) los ficheros regulares, y copiarlos a /tmp

# find . -type f -exec cp '{}' /tmp \;

Ojo: No te asustes, ahora te explico.

Cuando find encuentra un fichero, su nombre es sustituido por los carácteres '{}', de modo que cuando hacemos el ‘cp {} /tmp’ , es lo mismo que si hicieramos (uno por uno) un ‘cp fichero.txt /tmp’ o ‘cp fichero_regular.zip /tmp’, etc, etc.

Otro dato muy importante, es que para poder ejecutar alguna orden utilizando los nombres de los ficheros que find encuentra, necesitas utilizar -exec.

Los comandos que se pasan a find, utilizando -exec deben ser terminados con un ‘;’.

En el ejemplo previo viste que utilice \; para poder ‘escapar’ ese caracter. Ya que las ordenes que le damos a nuestro sistema mediante la consola son separados por ‘;’ tambien, debemos hacer que la consola ignore el ‘;’ y se lo pase a find

Ej. si ejecutamos

# clear; cd /tmp; ls

estos comandos serán ejecutados uno a continuación del otro, en el orden que los escribiste, separados por ‘;’ por nuestro sistema. Al utilizar \; , entonces la consola no lo interpreta y se lo envia directamente a find.

(Si esta parte no te quedo muy clara, escribeme, y asi la aclaro mejor)

d. Encontrar en el directorio actual los ficheros (de cualquier tipo) que tengan permisos 644

# find . -perm 664

e. Encontrar en el directorio /usr/src los archivos cuyo nombre terminen en .c (codigo fuente) y cuyo tamaño sea mayor a 100k, e imprimirlos (en pantalla).

# find /usr/src -name '*.c' -size +100k -print

Fijate que nuevamente utilice el caracter comodin ( * ) dentro de comillas, para evitar que el shell lo expanda (interprete).

Es conveniente que se den una ojeada al man page de ‘find’; poco a poco ire agregando mas ejemplos practicos a esta lista. (Si te interesa saber como hacer algo con find, enviame un msg).

This entry was posted in Comandos, General, migrated.

One Response to Comando find en Linux

  1. Pingback: Administrando archivos y directorios | Descenso a la locura

Leave a Reply