Test Foro de elhacker.net SMF 2.1

Sistemas Operativos => GNU/Linux => Mensaje iniciado por: madpitbull_99 en 28 Julio 2011, 21:44 PM

Título: Introducción al comando Find
Publicado por: madpitbull_99 en 28 Julio 2011, 21:44 PM
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:

Código (bash) [Seleccionar]
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":

Código (bash) [Seleccionar]
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:

Código (bash) [Seleccionar]
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:

Código (bash) [Seleccionar]
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:

Código (bash) [Seleccionar]
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:

Código (bash) [Seleccionar]
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:

Código (bash) [Seleccionar]
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:

Código (bash) [Seleccionar]
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:

Código (bash) [Seleccionar]
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:

Código (bash) [Seleccionar]
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:

Código (bash) [Seleccionar]
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:

Código (bash) [Seleccionar]
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:

Código (bash) [Seleccionar]
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:

Código (bash) [Seleccionar]
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/).


Título: Re: Introducción al comando Find
Publicado por: leogtz en 28 Julio 2011, 22:44 PM
Muy buen aporte, me ha gustado.

Otra cosa que comentar es la posibilidad de usar expresiones regulares para encontrar los archivos. :D
Título: Re: Introducción al comando Find
Publicado por: portaro en 28 Julio 2011, 22:55 PM
GRacias magnifico aporte.