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.
Este artículo está basado en 15 Practical Linux Find Command Examples (http://www.thegeekstuff.com/2009/03/15-practical-linux-find-command-examples/).
En el blog del autor, podéis encontrar la segunda parte del artículo: 15 Awesome Linux Find Command Examples (Part2) (http://www.thegeekstuff.com/2009/06/15-practical-unix-linux-find-command-examples-part-2/).
Muy buen aporte, me ha gustado.
Otra cosa que comentar es la posibilidad de usar expresiones regulares para encontrar los archivos. :D
GRacias magnifico aporte.