Usando find: ejecuciones útiles.

Como sabemos, el comando find sirve para realizar busquedas (ver findutils en GNU Software).

En este artículo vamos a enumerar y resumir algunos ejemplos útiles del mismo que pueden ayudarnos a resolver ciertos problemas comenzando por los ejemplos más simples.

  1. Buscar un fichero cuyo nombre contenga un string:

find . -name "*.mp3"

La salida de la ejecución anterior buscará recursivamente todos los ficheros que contengan el string «*.mp3» desde el directorio desde donde se lance el comando.

Si quisiéramos buscar un fichero que contenga en su nombre un string sin tener en cuenta mayúsculas y minúsculas (no case sensitive):

find . -iname "*.mp3"

2. Busqueda de ficheros de tamaño mayor que X (busqueda de los ficheros más pesados).

Solaris:

 find . -size +200000

Cada unidad del número definido después de size equivale a 512 bits, por lo tanto, la ejecución anterior listaría ficheros de más de unos 100 Mb.

GNU/Linux:

find . -size +100M

Mucho más intuitivo en GNU/Linux. Como puede deducirse por el tercer parámetro que pasamos al comando find, ejecutando la sentencia anterior obtendremos los ficheros de más de 100M de peso.

3. Busqueda de strings contenidos en ficheros. Lista los ficheros que contienen el string que pasamos como parámetro al comando grep:

find . | xargs grep -li "ratas_de_shell"

 La ejecución de la sentencia descrita anteriormente nos devolvería por la salida standard el listado de los ficheros que contengan el string «ratas_de_shell» desde el directorio que se ejecute.

Si la lista fuera muy larga, podríamos redireccionar la salida a un fichero mediante:

find . | xargs grep -li "ratas_de_shell" > listado_ficheros_con_ratas.txt

 De esta forma, generaríamos un fichero listado_ficheros_con_ratas.txt cuyo contenido sería el descrito anteriormente.

Por otro lado, si supiéramos parte del nombre de los ficheros que contienen este string o quisiéramos acotar la busqueda por ejemplo a ficheros de cabecera si estuviéramos programando en C, podríamos ejecutar la siguiente sentencia añadiendo -name a find:

find . -name "*.h*" | xargs grep -li "ratas_de_shell" > listado_ficheros_con_ratas.txt

 4. Comprobar en que ficheros se escribe al replicar un error:

Imaginemos que tenemos algún tipo de problema/error a la hora de ejecutar un programa y necesitamos toda la información posible para tratar de acotarlo. Una buena práctica sería la siguiente: crear un fichero, reproducir el problema y realizar una busqueda de los ficheros cuya fecha de modificación sea posterior a la de la creación del fichero de test. De esta forma, seríamos capaces de revisar en que ficheros se escribe (por ejemplo, logs) cuando replicamos el error en cuestión. Para ello:

touch now

 Replicamos el error y ejecutamos:

find . -newer now

De forma similar, si quisiéramos buscar los ficheros modificados en los últimos 35 minutos:

find . -mmin -35

5. Búsqueda de ficheros por permisos:

Otra búsqueda que nos resultará útil es la búsqueda de ficheros cuyos permisos cumplan una determinada máscara. Por ejemplo:

Ficheros con permisos rw- para el propietario (la búsqueda no tiene en cuenta los permisos a nivel group y others):

find . -type f -user usuario -perm -u+rw

Ficheros con permisos rw- para el grupo (la búsqueda no tiene en cuenta los permisos a nivel user y others):

find . -type f -user usuario -perm -g+rw

Ficheros con permisos rw- para others (la búsqueda no tiene en cuenta los permisos a nivel user y group):

find . -type f -user usuario -perm -o+rw

6. Búsqueda de enlaces rotos (GNU/Linux):

find . -xtype l

7. Modificar el contenido de ficheros que contengan un string determinado STRING_OLD por otro nuevo STRING_NEW:

# Backup: Realizamos un tar de los ficheros a modificar.

tar -cvf backup_modificacion.tar `find . -type f -print0 | xargs -0 grep -l STRING_OLD`

mv backup_modificacion.tar ../

# Modificacion del contenido de los ficheros:

find . -type f -print0 | xargs -0 grep -l STRING_OLD | xargs sed -i 's/STRING_OLD/STRING_NEW/'

8. Utilizar OR para buscar varios strings en el nombre de ficheros:

find . \( -name "*txt" -o -name "*h" \)

9. Excluir extensiones *.log y *.txt a la hora de buscar:

find . -type f ! -name "*.log" ! -name "*.txt"

10. Buscar ficheros entre dos fechas (timestamps) y ordenar la salida por fecha de mofidicación del fichero:

find . -type f -newermt "2024-03-17 11:11:05" ! -newermt "2024-03-18 20:08:53" -printf "%T+ %p\n" | sort

Ójala os ayude.

Saludos desde el otro lado de la pantalla negra.

Esta entrada ha sido publicada en Sin categoría y etiquetada como , , , , , , . Guarda el enlace permanente.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *