Foro de elhacker.net

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
  1. mad@mad-laptop:~/test$ ls
  2. backup.sh      paso_referencia.c  punteros.c    Stuff
  3. 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
  1. find -name "punteros.c"
  2. ./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
  1. mad@mad-laptop:~/test$ find -iname "pilas_colas.cpp"
  2. ./Pilas_Colas.cpp


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

Código
  1. mad@mad-laptop:~/test$ pwd
  2. /home/mad/test
  3. mad@mad-laptop:~/test$ find /home/mad/test -name punteros.c
  4. /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
  1. mad@mad-laptop:~/test$ sudo find / -maxdepth 3 -name backup.sh
  2. mad@mad-laptop:~/test$ sudo find / -maxdepth 4 -name backup.sh
  3. /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
  1. mad@mad-laptop:~/test$ sudo find / -maxdepth 3 -maxdepth 5 -name backup.sh
  2. /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
  1. mad@mad-laptop:~/test$ find ./Stuff -iname "SoCkeTs.c" -exec md5sum {} \;
  2. 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
  1. mad@mad-laptop:~/test$ find . -not -iname "sockets.c"
  2. .
  3. ./punteros.c
  4. ./Stuff
  5. ./Stuff/pr0n.avi
  6. ./Stuff/biografia.txt
  7. ./Stuff/links.txt
  8. ./backup.sh
  9. ./punteros.cpp
  10. ./find_intro.sh
  11. ./paso_referencia.c
  12. ./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
  1. mad@mad-laptop:~/test$ find . -perm -g=x -type f -exec ls -l {} \;
  2. -rwxrwxrwx 1 mad mad 198 2011-07-28 20:49 ./find_intro.sh
  3. -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
  1. mad@mad-laptop:~/test$ find ~ -empty
  2. /home/mad/.evolution/mail/local/Outbox
  3. /home/mad/.evolution/mail/local/Drafts
  4. /home/mad/.evolution/mail/local/Sent
  5. /home/mad/.evolution/mail/local/Templates.ibex.index.data
  6. /home/mad/.evolution/mail/local/Templates
  7. /home/mad/.evolution/mail/local/Sent.ibex.index.data
  8. /home/mad/.evolution/mail/local/Outbox.ibex.index.data
  9. /home/mad/.evolution/mail/local/Drafts.ibex.index.data
  10. /home/mad/.evolution/calendar/config
  11. /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
  1. mad@mad-laptop:~/test$ sudo find . -type f -exec ls -s {} \; | sort -n -r | head -3
  2. 4 ./find_intro.sh
  3. 0 ./Stuff/sockets.c
  4. 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
  1. mad@mad-laptop:~/test$ find ~ -type f -name ".*"
  2. /home/mad/.hgrc
  3. /home/mad/.recently-used
  4. /home/mad/.xvidcaprc
  5. /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
  1. 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
  1. 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.