El uso del comando find en linux

0
1047

Hoy en dia, los buscadores de escritorio que se han integrado tanto en GNOME como en KDE han restado cierta popularidad a las herramientas tradicionales de búsqueda de archivos, y de hecho proyectos como Nepomuk darán a este tipo de tareas una nueva dimensión, la semántica.

Sin embargo esto no quita para que no podamos recurrir a las viejas utilidades cuando lo necesitemos.

Este es el caso del comando find, uno de los legendarios de los sistemas Unix y por supuesto de las distribuciones Linux, y que permite realizar todo tipo de búsquedas de archivos tanto por los nombre como por los distintos atributos que tienen esos mismos archivos.

Aunado a esto, hemos generado un pequeño tutorial de consejos para usar find, y lo cierto es que este recorrido nos permitirá exprimir el funcionamiento de este comando.

1. Uso básico

Lo normal es que utilicemos find para encontrar el nombre de un archivo en el directorio, no solo donde lo dejamos, sino cómo se llama ese archivo exactamente. Para ello basta con utilizar el formato

find [camino…] [expresión] o
find -name nombre_del_archivo

Camino es la ruta o rutas a partir de la cual empezara las búsquedas, puede ser una o más de una.

find ./PDF/ ./xarxa/ -iname “*.pdf”

Todos los pdf que hay en los directorios PDF y xarxa.

La parte de expresión empezara en el momento en que se encuentre uno de estos caracteres

“-”  “(” “)”  “,”  “!”

 

Sin embargo la mejor manera de entenderlo son con ejemplos

Para buscar un archivo es:

find . -name “*.txt”

Nos devolverá todos los archivos con extensión txt que haya en el directorio y recursivamente en todos sus subdirectorios.

Debemos tomar en cuenta que el comando find distingue entre mayúsculas y minúsculas, así la instrucción anterior no nos devolverá los archivosque acaben en TXT. Para que no distinga entre mayúsculas y minúsculas tenemos la opción -iname.

find . -iname “*.txt”

2. Búsqueda por tamaño

A veces es importante encontrar archivos por su tamaño, y para ello basta aplicar un parámetro tal como se muestra a continuación:

find -size 100k
find . -size +1000k

lo que permitiría buscar archivos con un tamaño exacto de 100 kilobytes o 1000 kilobytes. Es probable que lo que queramos es encontrar archivos con un tamaño superior o inferior a esa cifra en cuyo caso usaríamos

find size +100k

y para los archivos con mayor tamaño de 100k, y

find size -100

para archivos de menor de 100k.

Por cierto, si necesitamos buscar en gigabytes, basta con poner 100G.

Archivos vacios.

find . -empty
find . -empty -type f

También podemos buscar por tipos.

Buscar archivos

find . -type f

Buscar directorios

find . -type d

Buscar enlaces simbólicos.

find . -type l

 

 

3. Búsqueda por usuario

También podemos buscar archivos que pertenecen a cierto usuario o que no pertenecen a nadie y han quedado “huérfanos”, con la orden:

find –nouser ó
find . –nogroup
find . -nouser

 

Si queremos buscar archivos de alguien concreto usaremos las opciones -user o -uid. En este último caso deberemos saber el identificador de un usuario, algo que no es lo normal que sepamos, pero siempre viene bien tenerlo en cuenta. Además podemos buscar archivos que pertenecen a un usuario A o a un usuario B con el parámetro -o, con lo que escribiríamos:

find -user root -o -user www-data

O también por los permisos que tengan concedidos o grupo al que pertenezcan.

Buscar archivos del grupo admin

find . -group admin

Archivos del usuario pepe

find . -user pepe

 

Y como era de esperar, también podemos buscar los archivos que NO pertenecen a un usuario concreto:

find -not -user www-data

4. Búsqueda por grupo

Lo mismo se podría aplicar a la búsqueda por grupos que puede afectar al nombre de grupo o al GID de ese grupo (con el mismo flag, cuidado), y haríamos un simple

find -group nombredelgrupo

(o giddelgrupo)

Obviamente, podemos combinar esta opción con el resto de opciones, para por ejemplo encontrar archivos que pertenecen a cierto grupo y que además pertenecen a cierto usuario dentro del grupo.

 

5. Búsqueda por permisos

Uno de los usos más importantes de find -y probablemente de los más desconocidos- es su capacidad de encontrar archivos con ciertos permisos, algo que nos permite detectar archivos que no tienen los permisos que deberían tener y que pueden suponer una amenaza para la seguridad del sistema. Las opciones más sencillas de usar son -readable, -writeable y -executable, aunque también podemos usar el parámetro -perm a partir del cual podemos establecer esos tres permisos a la vez con la típica combinación de tres números. Por ejemplo:

find -type f -perm -110

Buscaría archivos con el bit de ejecutable activado para el usuario y el grupo, y el “-” le indica que ignore otros bits. O sea, que no importa si el archivo es de lectura o de escritura, porque lo que queremos es que aparezcan todos los que tienen ese bit de ejecución.

Si queremos que específicamente se busquen archivos que tengan el bit ejecutable para usuario y grupo usaríamos “/”, y no “-”:

find -type f -perm /110

Lo que buscaría solo aquellos archivos con esos permisos, y no otros.

Archivos que tengan todos los permisos concedidos para todos

find . -perm 777

6. Usando expresiones regulares

La potencia del comando find crece al usar las expresiones regulares (con la sintaxis tradicional regex) que permite aplicar estas potentes (pero complejas) expresiones para realizar búsquedas mucho más avanzadas. Podemos establecer este tipo de búsqueda con el parámetro -regextype, y luego alguno de los tipos de expresiones soportados con los parámetros posix-awk, posix-egrep, etc.  Consultad la página del manual para ampliar información.

Por ejemplo si quisiéramos encontrar archivos con extensión .php o .js haríamos lo siguiente:

find -regextype posix-egrep -regex ‘.*(php|js)$’

Al principio puede parece un poco complicado, pero si analizáis la expresión regular todo cobra sentido. La potencia que ofrecen las expresiones regulares es impresionante, pero ya solo este tema bastaría para un post dedicado a ellas.

7. Búsquedas por fechas

Si quisiéramos encontrar archivos por su edad, podríamos hacerlo también con tres parámetros específicos para estas tareas. Por tiempo de acceso (-atime), por última modificación (mtime) o por el último cambio de archivo (-ctime). Todas las cifras, expresadas en días, cuidado.

Por ejemplo, busquemos archivos que no hayan sido modificados en los dos últimos días

find -mtime +2

Podemos combinar las opciones y buscar archivos en un rango, por ejemplo, archivos que tengan entre 2, 5 y 15 ultimos días:

find -mtime +2 -mtime -5

find /home/ -name ‘*.avi’ -a -size +700M -mtime -15

8. Búsquedas por minutos

Una especie de rama de lo anterior, pero que es importante porque trabaja con sus propios parámetros que son -amin, -cmin y -mmin, análogas a las que habíamos visto antes. Simplemente hay que tener en cuenta que en este caso la búsqueda es de cifras en minutos, no de días, lo que permite buscar con mucha mayor precisión en el tiempo.

9. Limitar las búsquedas

A veces el comando find proporciona más resultados de los que necesitamos o queremos, y para limitar esos resultados podemos utilizar la opción -maxdepth. Por ejemplo, si queremos encontrar un archivo JavaScript en nuestro directorio wordpress, haríamos lo siguiente:

find wordpress -name “*js”

pero si solo quisiéramos buscar en el directorio de primer nivel haríamos

find wordpress -maxdepth 1 -name “*js”

Si quisiéramos buscar en el directorio y en la primera rama de subdirectorios habría que poner “-maxdepth 2?, y así sucesivamente según la profundidad de directorios en la que queremos buscar archivos.

10. Combinando find con otros comandos

Como era de esperar, es posible combinar find con otros comandos para construir potentes sentencias, por ejemplo en conjunción con xargs o con la opción -exec para manipular los archivos tras haberlos encontrado.

Ademas sobre los resultados de find se pueden ejecutar ciertas acciones, esto se hace indicándolo con -exec orden. la cadena {} se reemplazará por el nombre del fichero que se esta procesando.

find . -iname “*.html” -exec cat {} \;

Si substituimos -exec por -ok orden, tendrá el mismo efecto pero esta vez nos pedirá confirmación antes de ejecutar la orden.

find . -iname “*.html” -ok cat {} \;

Todas las expresiones que aquí se han mostrado y muchas más que hay disponibles (consultar man find), se pueden combinar entre ellas.

se han de cumplir las dos expresiones (and implícito)

expr1 expr2

Solo se ha de cumplir una de ellas

expr1 -or expr2

Si no se cumple la expr1

! expr1

si no se cumple la expr1 y se cumple expr2

! expr1 expr2

 

Por ejemplo, si quisiéramos cambiar los permisos de un puñado de archivos de root al usuario www-data haríamos:

find -user root -exec chown www-data {} \;


Mas ejemplos:

find . -type f  -exec ls –l {} \;
find . -type f  -exec chmod 664 {} \;

find . -type d  exec ls –l {} \;
find . -type d  exec chmod 755 {} \;

find . -name “*.bak” -exec rm {} \;
find . -type d -exec ls {} \;

 

Copiar todas las imágenes jpg o png del directorio Imágenes al directorio dibuix.

find ./Imágenes/* -iname “*.jpg” -or -iname “*.png” -exec cp {} tmp/dibuix \;

Podemos poner en minúsculas todas las letras de los archivos.

find -type f -exec rename ‘tr/A-Z/a-z/’ “{}” \;

 

Este comando hace que todos los archivos que se encuentren y sean propiedad de root, sean utilizados por el comando chown para cambiarle el propietario.

Como suele decirse, las posibilidades parecen ilimitadas. Pero como veis, find es un comando espectacularmente útil si se sabe usar con sabiduría.

Por último, este comando muchas veces nos devuelve una cantidad de errores que en la mayoría de los casos nos impiden poder ver los resultados. Para evitarlos lo que se hace es redireccionarlos hacia la papelera del sistema.

Si queremos buscar un archivo en todo el servidor, tenemos que hacer lo siguiente.

find / -iname nom_archivo

Esto nos devolvería una cantidad de avisos de permiso denegado, la forma de evitarlo es la siguiente.

find / -iname nom_archivo 2>/dev/null

Todos los errores (2) los redireccionamos (>) al vacío (/dev/null)

Obviamente existen mas combinaciones que las que se han ilustrado aquí… si sabes de algunas más no dudes enviarlas para su publicación

LEAVE A REPLY

Please enter your comment!
Please enter your name here