Sistemas Operativos‎ > ‎GNU/Linux‎ > ‎

Introducción al comando Find


El comando por excelencia para buscar archivos en Linux es find. En este articulo se pretende dar
una introducción a este comando.

Para los ejemplos trabajare sobre una carpeta llamada "test" con la siguiente estructura:

mad@mad-laptop:~/test$ ls
backup.sh      paso_referencia.c  punteros.c    Stuff
find_intro.sh  Pilas_Colas.cpp    punteros.cpp


El ejemplo mas básico es buscar por nombre de fichero, en mi caso buscare un fichero llamado "punteros.c":

find -name "punteros.c"
./punteros.c

El parametro -name tiene en cuenta si la palabra tiene letras en minúscula o mayúscula, si se quiere
ignorar eso, hay que usar el parametro -iname:

mad@mad-laptop:~/test$ find -iname "pilas_colas.cpp"
./Pilas_Colas.cpp


Para limitar la búsqueda a un directorio, se hace de la siguiente manera:

mad@mad-laptop:~/test$ pwd
/home/mad/test
mad@mad-laptop:~/test$ find /home/mad/test -name punteros.c
/home/mad/test/punteros.c

En mi caso, he limitado la búsqueda a la carpeta /home/mad/test.

Podemos indicarle hasta el nivel de profundidad al realizar la busqueda:

mad@mad-laptop:~/test$ sudo find / -maxdepth 3 -name backup.sh 
mad@mad-laptop:~/test$ sudo find / -maxdepth 4 -name backup.sh
/home/mad/test/backup.sh

En el primero ejemplo estamos partiendo desde /(root) y le indicamos que busque el fichero "backup.sh" en los
tres primeros niveles, como veréis el comando no arroja ningún resultado.

A continuación lanzamos el mismo comando pero indicándole que busque en los cuatro primeros niveles y vemos que
encuentra el fichero deseado.

Se le puede indicar un rango de niveles de profundidad:

mad@mad-laptop:~/test$ sudo find / -maxdepth 3 -maxdepth 5 -name backup.sh 
/home/mad/test/backup.sh

En este ejemplo se buscara entre los niveles tres y cinco.

Mediante el parámetro -exec podemos ejecutar otros comandos a medida que se encuentran ficheros:

mad@mad-laptop:~/test$ find ./Stuff -iname "SoCkeTs.c" -exec md5sum {} \;
d41d8cd98f00b204e9800998ecf8427e  ./Stuff/sockets.c

En este caso, se buscan un fichero llamado "SoCkeTs.c" y se le calcula el hash MD5.

Para invertir la búsqueda, se hace la siguiente manera:

mad@mad-laptop:~/test$ find . -not -iname "sockets.c"
.
./punteros.c
./Stuff
./Stuff/pr0n.avi
./Stuff/biografia.txt
./Stuff/links.txt
./backup.sh
./punteros.cpp
./find_intro.sh
./paso_referencia.c
./Pilas_Colas.cpp

El comando anterior encuentra todos los ficheros cuyo nombre no es "sockets" y limitando la búsqueda
al directorio actual (mediante el punto .).

Una función muy útil en cuanto a auditorias de seguridad es la búsqueda de ficheros por permisos:

mad@mad-laptop:~/test$ find . -perm -g=x -type f -exec ls -l {} \;
-rwxrwxrwx 1 mad mad 198 2011-07-28 20:49 ./find_intro.sh
-r-xr-xr-x 1 mad mad 0 2011-07-28 20:49 ./paso_referencia.c

El ejemplo de arriba busca todos los ficheros situados en el directorio actual y que tengan permisos de ejecución
para "el grupo".

Otra función bastante útil puede ser la búsqueda de ficheros vacíos:

mad@mad-laptop:~/test$ find ~ -empty
/home/mad/.evolution/mail/local/Outbox
/home/mad/.evolution/mail/local/Drafts
/home/mad/.evolution/mail/local/Sent
/home/mad/.evolution/mail/local/Templates.ibex.index.data
/home/mad/.evolution/mail/local/Templates
/home/mad/.evolution/mail/local/Sent.ibex.index.data
/home/mad/.evolution/mail/local/Outbox.ibex.index.data
/home/mad/.evolution/mail/local/Drafts.ibex.index.data
/home/mad/.evolution/calendar/config
/home/mad/.evolution/memos/config

Eso buscara todos los ficheros vacíos de la carpeta personal del usuario.

Podemos buscar los ficheros mas grandes del sistema:

mad@mad-laptop:~/test$ sudo find . -type f -exec ls -s {} \; | sort -n -r | head -3
4 ./find_intro.sh
0 ./Stuff/sockets.c
0 ./Stuff/pr0n.avi

Eso buscara los tres ficheros mas grandes de la carpeta "this" o en la que estamos.

Usando la búsqueda por tipo podemos por ejemplo, buscar todos los ficheros ocultos:

mad@mad-laptop:~/test$ find ~ -type f -name ".*"
/home/mad/.hgrc
/home/mad/.recently-used
/home/mad/.xvidcaprc
/home/mad/.scapy_history

Recuerdo que en Unix/Linux los ficheros ocultos tienen un punto delante del nombre, en este caso se buscan
todos los que empiezan por un punto, o sea, todos los ocultos.

Otra función bastante útil es la búsqueda de ficheros por tamaño:

mad@mad-laptop:~/test$ sudo find ~ -size +10M

Encontrara todos los ficheros mayores de diez megas en la carpeta personal del usuario.

Para las operaciones que mas usamos, podemos crear un alias:

mad@mad-laptop:~/test$ alias rmao="find . -iname a.out -exec rm {} \;"

Ese alias, al ejecutarlo, borrara todos los ficheros con el nombre "a.out" encontrados en el
directorio actual.

Post original: Introducción al comando Find

Comments