Lo que he aprendido: el comando find

El comando find me lía. Es así. Así que después de un comentario explicativo de mi hermano he decidido ganarle y aprender a usarlo para no tener que usar locate todo el rato.

Suelo buscar así:

sudo updatedb
locate PATRÓN

Donde PATRÓN es el nombre de lo que quiero encontrar, generalmente usando comodines.

Usando find para hacer lo mismo tendría que escribir:

find LUGAR -name PATRÓN

Por defecto busca en la carpeta actual y si no le damos ningún argumento listará todos los archivos y carpetas del directorio actual recursivamente. El problema si buscamos en todo el equipo es que habrá archivos para los que no tenga acceso y nos escribirá montones de líneas con esta pinta:

find: «/var/lib/lightdm»: Permiso denegado

Así no veremos dónde está lo que estamos buscando. Para evitarlo podemos redirigir los errores a /dev/null, en palabras del teleco de la familia un archivo especial de Linux que siempre está vacío, si escribes en él, desaparece el contenido, si lees de él está vacío:

find LUGAR -name PATRÓN 2>/dev/null

El 2 ese es un descriptor de archivo, hay tres con un significado especial:

  • 0: de aquí lee la entrada estándar (stdin), viene generalmente del teclado.
  • 1: aquí escribe la salida estándar (stdout), si no la hemos redireccionado irá al terminal.
  • 2: aquí escribe el error estándar (stderr), si no la hemos redireccionado también irá al terminal. A diferencia de 1, 2 no acumula y va escribiendo las cosas según le van llegando.

Veamos un ejemplo de búsqueda, localicemos todos los archivos del ordenador con extensión py:

find / -name "*.py" 2>/dev/null 

Otra opción interesante del comando find es -type que con d busca carpetas (directory) y con f archivos (file). Pero la opción más guay es -exec, que nos permite ejecutar cosas. Escribimos algo con esta estructura:

find LUGAR -name PATRÓN -exec ORDEN {} \;

Y él sustituirá en {} el nombre de cada archivo que ha encontrado y ejecutará la orden que le hemos dicho. Los espacios son importantes, si escribimos la orden con las llaves seguidas no carrulará.

Por ejemplo, para eliminar de la carpeta actual todas las copias de seguridad que fabrica Emacs podemos hacer:

find . -name "*~" -exec rm {} \;

Sí, ya sé que hay una opción -delete que hace exactamente eso, pero no se me ocurría ningún ejemplo decente, ¿vale? Se pueden hacer cosas más interesantes, ¡hurgad por ahí y me contáis lo que habéis encontrado!

Para acabar os dejo un minivídeo que cuenta estas movidas porque me hace gracia como habla:

Más

A collection of Unix/Linux ‘find’ command examples

Man page de find


Suena en mi casa:

Anuncios

10 pensamientos en “Lo que he aprendido: el comando find

  1. Justo

    no se si has visto la serie Mr Robot… Primera tempora… capitulo 8 alrededor del minuto 12:13…
    teclea en la pantalla: find / -type d 1>/dev/null
    🙂 curiosa coincidencia

    Responder
    1. Ondiz Autor de la entrada

      Pues mira que veo la serie y no me había fijado! Qué guay! Ahora mismo pongo mi famoso botón rojo que lleve a algo sobre Mr Robot y Linux.

      Gracias por comentar!

      Responder
  2. nasciiboy

    lol, “*~” tambien recurria a find para borrar las “migas” de emacs, finalmente suprimi esa caracteristica… sin dejar de maldecir algunos descudos gordos perdiendo varias horas de trabajo, por algun lugar vi la receta para poner los respaldos en una carpeta especifica, pero no pude replicarla correctamente

    Responder
  3. Pingback: En qué ando: junio | Onda Hostil

¡Opina sin miedo! (Puedes usar Markdown)

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s