A veces tenemos el problema de no recordar donde se encuentra un archivo, entonces es necesario buscarlo. Para esto, sólo hace falta recordar el nombre, o parte del nombre, del archivo. En GNU/Linux, el comando find busca archivos en una jerarquía de directorios. Para los usuarios novicios (o quienes vienen desde otro sistema operativo) puede resultar dificil o desconocido ya que find es una de las herramientas más completas, complejas y poderosas de la consola/terminal/línea de comandos/shell. Por eso en este artículo explico cómo buscar correctamente archivos por nombre utilizando comodines (wildcards), por ejemplo astreriscos y símbolos de pregunta.

La llamada a find utiliza la siguiente sintaxis:

find [opciones] [ruta] [expresión]

Para buscar archivos por nombre es necesario utilizar la expresión -name (sensible a mayúsculas) o -iname (no sensible a mayúsculas). La opción -name necesita un patrón de búsqueda (shell pattern) para buscar coincidencias dentro de los nombres base de los archivos (nombre sin la ruta al archivo). Es posible utilizar los comodines (wildcards) '?' para coincidir con cualquier caracter y '*' para coincidir con cualquier núemro de cualquier caracter. -iname es similar excepto que no es sensible a mayúsculas, por lo tanto los patrones 'fo*' y 'F??' coincidirán con los nombres de archivo "Foo", "FOO", "foo", "fOo", etc.

Comencemos con un ejemplo, estamos posicionados dentro del directorio /tmp/pepe/ el cual posee el siguiente contenido:

# cd /tmp/pepe/
# ls -l
total 0
-rw-r--r-- 1 root root 0 Oct 29 10:04 10-pepe_muleiro.mp3
-rw-r--r-- 1 root root 0 Oct 29 11:06 muleiropepe2.jpg
-rw-r--r-- 1 root root 0 Oct 29 10:05 pemuleiro.php
-rw-r--r-- 1 root root 0 Oct 29 10:04 pepemuleiro
-rw-r--r-- 1 root root 0 Oct 29 10:04 pepe-muleiro
-rw-r--r-- 1 root root 0 Oct 29 10:06 pepe-muleiro06.class
-rw-r--r-- 1 root root 0 Oct 29 10:05 pepe.txt

Deseamos buscar archivos cuyo nombre contenga las palabras "pepe" y "muleiro" en ese orden, entonces ejecutamos:

# find ./ -iname pepe
#

No hay resultados. Pero, ¿cómo puede ser si ls lista varios archivos cuyo nombre contiene la palabra "pepe". El parámetro ./ indica que se busque a partir del directorio actual (/tmp/pepe). Con -iname indicamos que busque archivos cuyo nombre sea "pepe", ignorando las mayúsculas (case). Entonces el resultado es correcto porque no hay ningún archivo de nombre "Pepe", "PEPE", "pEpe", etc.

Para buscar archivos cuyo nombre contenga una palabra en cualquier posición, es decir que el nombre de archivo no coincida exactamente con el patrón especificado, es necesario utilizar los comodines. Entonces ejecutamos:

# find ./ -iname *pepe*
find: paths must precede expression: muleiropepe2.jpg
Usage: find [-H] [-L] [-P] [-Olevel] [-D help|tree|search|stat|rates|opt|exec] [path...] [expression]

Y tal como se observa el comando find retorna error de sintaxis. Esto se debe a que cuando utilizamos wildcards es necesario especificar el patrón utilizando comillas. La sintaxis correcta es:

# find ./ -iname "*pepe*"
./10-pepe_muleiro.mp3
./muleiropepe2.jpg
./pepe.txt
./pepe-muleiro06.class
./pepe-muleiro
./pepemuleiro

Se observa que ahora funciona correctamente.

Pero, recordemos que deseabamos obtener un listado de los archivos que contengan las palabras "pepe" y "muleiro", en ese orden. Para lograr el cometido debemos utilizar el patrón "pepe*muleiro":

# find ./ -iname "pepe*muleiro"
./pepe-muleiro
./pepemuleiro

La salida es correcta, ya que el patrón coincide con los nombres de archivo que comienzan con "pepe" y terminan con "muleiro", con un numero de caracteres aleatorios mayor o igual a cero entre medio.

Aunque no retorna los archivos cuyo nombre contiene "pepe" y "muleiro" con un número arbitrario de caracteres al principio y al final. Necesitamos entonces agregar un asterisco adicional al comienzo y al final del patrón, de la siguiente forma:

# find ./ -iname "*pepe*muleiro*"
./10-pepe_muleiro.mp3
./pepe-muleiro06.class
./pepe-muleiro
./pepemuleiro

Un escenario donde podemos utilizar este tipo de búsquedas es el siguiente: sé que en alguna parte de mi directorio $HOME he guardado mi discos de Rick Astley en formato mp3, ¡pero no recuerdo donde exactamente, y quiero escuchar "Never Gonna Give You Up"!

Para encontrar este archivo podría utilizar el siguiente comando: $ find ~ -iname "*never*gona*mp3". En este caso es importante utilizar -iname, porque si utilizara -name no encontraría el archivo "01 - Rick Astley - Never Gonna Give You Up.mp3" por ser sensible a las mayúsculas.

Por las dudas que no lo encuentren de todas formas, acá les dejo el video:

Que lo disfruten!


Tal vez pueda interesarte


Compartí este artículo