Blogia
Dr. Pc

Como encontrar archivos en Debian

Como encontrar archivos en Debian

En ocasiones se oye decir que linux es un sistema operativo más complicado de utilizar que Windows… Bueno, lo humanos tendemos a intentar simplificar para no volvernos locos y cuando algo no se parece a lo que estamos acostumbrados a utilizar, decimos que es más dificil. Sin embargo, no estamos siendo objetivos.

Cada comando de linux es un programa con multitud de opciones, modificadores, acciones, etc. y la versatilidad que ofrece al usuario es casi ilimitada. Es cierto que quizá esa versatilidad sacrifica una cierta claridad en el uso de estas herramientas, pero linux posee un excelente interfaz de ayuda: el man. Man nos permite obtener información inmediata sobre cada comando, simplemente anteponiendo la palabra man al comando de referencia. Cuando llevas un tiempo trabajando con linux esta herramienta se hace indispensable y se convierte en tu verdadera fuente de referencia y aprendizaje. Encontrar un fichero que ha sido modificado entre el 7 y el 9 de octubre, que contiene la palabra “factura”, que pertenece al usuario “contable1″, que tiene entre 1 y 2 Megabytes y que ha sido accedido entre la 12:30 pm y la 13:30 pm del 12 de Octubre es mucho más fácil en linux que en windows, sólo hay que saber “que tornillo apretar”, y esa información está en el man.

Para centrarnos en la búsqueda de ficheros en Debian vamos a comenzar por el comando find. Toda la información que ofrezco aquí está en el man, pero yo voy a intentar sintetizarla y ofreceros las opciones y comandos que a mi me resultan más útiles, aunque tus necesidades y las mias seguro que son distintas y quizá encuentres otros modificadores de mayor utilidad en el man que en mi texto. Además si conoceis otros modificadores o trucos interesantes, dejadme un comentario y lo incluyo en el texto.

El comando find:

Este comando nos permite buscar archivos indicando un punto de inicio de la búsqueda (path) y una expresión a buscar. Es uno de los comandos más utilizados. Por ejemplo si queremos buscar cualquier archivo que empiece por “syslog” en todo el árbol de directorios lo procesaríamos de la siguiente manera:

find / -name syslog*

*nota: si no ejecutas este comando como root, recibirás un mensaje de error cada vez que find intente acceder a un directorio para el que no tengas permiso. En este caso es recomendable dirigir los errores al dispositivo null, es decir, purgarlos: find / -name syslog* 2>/dev/null

Algunos otros modificadores útiles de find son:

-size +/-n[bkMG] donde n es el número de unidades de espacio que serán especificadas por b,k,M o G, es decir, bytes, kilobytes, Megabytes o Gigabytes respectivamente (hay más opciones). Veamos un ejemplo:

find /var/log/ -size +1M -size -20M buscará todos los archivos dentro de /var/log/ que tengan entre 1 y 20 Megabytes.

Para buscar a partir del directorio actual usaremos por ejemplo:

find . -name nombrearchivo el punto después de find indica que queremos buscar a partir de la ruta en la que nos encontramos.Aquí podemos usar otras opciones, incluso utilizar variables del sistema, como por ejemplo $HOME que corresponde a la ruta del directorio del usuario actual.

find $HOME -name nombrearchivo

Find busca de forma recursiva por defecto. Si queremos limitar la búsqueda al nivel de direcorio actual podemos usar el modificador -maxdepth 1, si quisieramos descender un nivel más en la estructura de directorios -maxdepth 2 y así sucesivamente.

También podemos especificar determinados tipos y así ignorar otros que no nos interesan; imaginemos que sólo necestamos buscar directorios:

find / -name log* -type d

En type podemos especificar varias opciones. las más comunes: d (directorios) , f (archivos normales) o l (links simbólicos).

Con -perm podemos encontrar archivos que tengan unos permisos determinados, bastante útil para securizar nuestro linux. Si lo combinamos con -user podemos localizar archivos que puedan ser modificados por un usuario determinado:

find /var/log/ -perm /222 -user usuario1

Si el resultado es muy amplio lo podemos redireccionar a un archivo para su análisis y añadir el modificador -ls, que nos listará ademas información ampliada sobre cada archivo:

find /var/log/ -perm /222 -user usuario1 -ls >> datos.txt

Otro modificador muy útil es el modificador por tiempo de acceso o modificación:

-mtime n Encontrará los ficheros que hayan sido modificados hace n*24 horas. Ignora las fracciones así que su uso no es tan evidente como el de -mmin. Si indicamos -mtime +1 buscará archivos modificados hace al menos 48 horas. Incluyo algunos ejemplos de uso más abajo, sino queda muy claro, consultad el man find.

-mmin n Encontrará los ficheros que hayan sido modificados hace n minutos.

Para ver los accesos sólo tenemos que cambiar la primera m por una a , es decir:

-atime n y -amin n

Por ejemplo

find / -mmin 1 encontrará todos los archivos que han sido modificados en el último minuto. Muy útil cuando queremos saber donde hemos dejado ese archivo que estábamos modificando hace un rato y que ahora no encontramos o qué archivos ha modificado alguna herramienta que hemos utilizado.

find . -atime 0 encontrará archivos que han sido accedidos en las últimas 24 horas.

find . -mtime 1 encontrará archivos que han sido modificados entre las últimas 24 y 48 horas.

find . -mtime +1 encontrará archivos que han sido modificados hace más de 48 horas.

find . -mtime +2 -mtime -5 encontrará archivos que han sido modificados hace más de 48 horas y menos de 5 dias.

Con la opción printf podemos dar formato al resultado que obtenemos, por ejemplo para redirigirlo a un archivo.Veamos el siguiente ejemplo:

find . -maxdepth 1 -name ‘[!.]*’ -printf ‘ Nombre: %fn Tamaño: %s bytesn Permisos: %Mn Grupo: %g n Usuario: %unn’

Analizamos el comando: con find . -maxdepth 1 ‘[!.]*’ le pido que busque a partir del directorio actual pero sin buscar dentro de subdirectorios todos los archivos que no estén precedidos por un punto, (en linux el punto inicial indica que estos archivos son ocultos). El operador ! es la negación de lo que viene a continuación. Con -printf comienzo a formatear el resultado. Primero escribo “Nombre” y imprimo el nombre del fichero, esto lo hacemos con la variable %f. Después hago un salto de línea /n. Hago lo propio para el tamaño, permisos, grupo y usuario propietario del archivo, utilizando las variables %s, %M, %g y %u respectivamentey por último pongo dos saltos de línea. La cosa quedaría tal que así:

Nombre: Desktop
Tamaño: 4096
Permisos: drwxr-xr-x
Grupo: root
Usuario: carranz

Nombre: mkchroot.sh
Tamaño: 4542
Permisos: -rwxr–r–
Grupo: root
Usuario: carranz

Nombre: tightvnc-1.2.9_javabin.zip
Tamaño: 127646
Permisos: -rw-r–r–
Grupo: root
Usuario: root

Esto es muy interesante ya que podría dirigir toda esta información a un archivo html automáticamente en el servidor web por ejemplo, si ya tuviesemos un archivo llamado tabla.html que contuviese las cabeceras html y una tabla con los nombres de los campos, podríamos rellenar la tabla así:

find . -maxdepth 1 -name ‘[!.]*’ -printf ‘<tr><td> %f</td><td> %s</td><td>%M</td><td> %g</td><td>%u</td></tr>’>>/var/www/tabla.html

Después sólo nos quedaría enviar un echo con el cierre de la tabla, el body y el html:

echo “</table></body></html>” >> /var/www/tabla.html

*nota recoduerda que al redirigir con >> añado al un fichero las líneas que quiero, no lo sobreescribo. Si lo redirigiese con una sola >, lo sobrescribiría.

Esto nos dejaría el listado de un determinado directorio convertido en html en nuestro servidor web que podríamos consultar o integrar con alguna aplicación web. Por supuesto que hay otras maneras de hacer esto pero no busco el fin, sino un ejemplo de la utilización de find con -printf.

Otro elemento potentísimo es la utilización de pipes con xargs. Por medio de este comando podemos filtrar la salida de find y ejecutar sobre aquellos archivos encontrados por find algúnprograma como grep, tar o gzip. Útil en este último caso para hacer backups por ejemplo de logs:

find /var/log/ -name syslog* -type f -mtime 0 | xargs tar -rf logs_backup_diario.tar

Con esto comprimo en logs_backup_diario los archivos syslog que han sido modificados en las últimas 24 horas.

Una de las fomras más útiles de combinar find con xargs: Necesito encontrar un texto dentro de varios archivos, primero necesito encontrar estos archivos y depués encontrar un texto dentro:

find /var/log/ -name syslog* -type f -mtime 0 | xargs grep failed

Con esto primero encuentro todos los archivos syslog y después encuentro todas las líneas de estos archivos que contienen la palabra “failed”. ¿Útil verdad?

Otra poderosa arma es el operador -o. Ya hemos visto que find concatena modificadores por defecto, si ponemos -mtime 0 -name prueba nos buscará archivos que se llamen prueba Y que haya sido modificados en las últimas 24 horas. Sin embargo podemos querer encontrar archivos que se llamen prueba O que hayan sido modificados en las últimas 24 horas. para ello empleamos -o:

find . -name prueba -o -mtime 0

En definitiva find es un comando muy potente que merece ser estudiado detenidamente, consultad el man find para conocer otras muchas posibilidades. Otra comando para buscar ficheros es locate, aunque lo detallaré más adelante en futuros artículos.

0 comentarios