Comandos útiles de linux - Buscar (usos básicos)
Publicado el
¿Cuántas veces no te ha pasado que no encuentras un archivo que andabas buscando? Bueno, no te preocupes más, aquí vas a encontrar la guía definitiva para poder encontrar todo lo que buscas en un simple comando.
Antes de empezar recordarte las 2 grandes filosofías de la línea de comandos:
- GIYF: Google Is Your Friend
- man: el comando man es y será siempre tu gran aliado, si no sabes como usar un comando, haz un “man comando” y podrás ver su página de ayuda donde encontrarás como invocarlo correctamente
Dicho esto, vamos a ello. Para esta guía vamos a centrarnos en varios puntos:
- Por nombre
- Por tipo
- Por tamaño
- Por contenido
Indicar que en casi todos los casos vamos a usar el comando find que nos devolverá un listado con un elemento por línea sobre la búsqueda realizada. Además como nota, find busca de manera recursiva en el directorio indicado.
Búsqueda por nombre
Para la búsqueda por nombre lo más común y sencillo es usar el commando find con el flag para buscar por nombre:
$ find . -name "nombre-fichero"
Como podrás ver lo primero que le paso al comando es un punto, seguido de un flag y un texto entre comillado, pues vamos a ver el detalle:
- . —> esto nos indica el directorio en el que queremos buscar, puede ser el actual (.) o cualquier otro como por ejemplo “/var/www/miportalweb.com/”
- -name —> es el flag para indicarle a find que queremos buscar por nombre de archivo
- “nombre-fichero” —> si conocemos el nombre podemos poner el nombre completo como “foto.jpg” pero si no lo conocemos también podemos usar patrones como “foto-*.jpg”
Aunque no sea obligatorio poner el nombre del fichero entre comillas, yo siempre lo recomiendo ya que si el nombre contiene espacios o caracteres especiales lo buscará correctamente
Búsqueda por tipo
Aquí es muy importante que diferenciemos que no es por extensión, si no por tipo de fichero que corresponde a lo siguiente:
/*
b block special
c character special
d directory
f regular file
l symbolic link
p FIFO
s socket
*/
$ find . -type d
Para este caso como podéis ver tenemos lo siguiente:
- . —> esto nos indica el directorio en el que queremos buscar, puede ser el actual (.) o cualquier otro como por ejemplo “/var/www/miportalweb.com/”
- -type —> es el flag para indicarle a find que queremos buscar por tipo de archivo
- d —> en este caso he buscado únicamente directorios que existan en cualquier nivel dentro de la ruta indicada
Tip: Si queremos buscar por ejemplo ficheros de tipo jpg podemos ejecutar el siguiente comando
$ find . -name "*.jpg"
Búsqueda por tamaño
¿A quién no le ha pasado que se queda sin espacio y no encuentra qué fichero le está ocupando el disco? Pues aquí tienes la solución, aquí vas a poder aprender a buscar por el tamaño del fichero. Aquí podemos usar varios flags:
/*
k kilobytes (1024 bytes)
M megabytes (1024 kilobytes)
G gigabytes (1024 megabytes)
T terabytes (1024 gigabytes)
P petabytes (1024 terabytes)
*/
$ find . -size 10M
Para este caso como podéis ver tenemos lo siguiente:
- . —> esto nos indica el directorio en el que queremos buscar, puede ser el actual (.) o cualquier otro como por ejemplo “/var/www/miportalweb.com/”
- -size —> es el flag para indicarle a find que queremos buscar por tipo de tamaño
- 6M —> en este caso he buscado únicamente los ficheros que tienen un tamaño exacto de 6Megabytes
Tip: si no conocemos el tamaño exacto podemos usar los modificadores + y - para indicar si queremos ficheros mayores o menores:
Para buscar ficheros mayores a 10MB
$ find . -size +10M
Para buscar ficheros menores a 10MB
$ find . -size -10M
Búsqueda por contenido
Tengo que admitir que esta es mi favorita y la que más suelo usar cuando tengo que buscar sobre todo en ficheros CSV o con un montón de texto. Para este caso el comando find no nos vale ya que no entiende de lo que hay dentro de los ficheros, pero vamos a apoyarnos en un poco de scripting básico que nunca está de más. Nuestros grandes apoyos, el comando grep, el comando while y una condición if que son dos de nuestros básicos.
Para este comando antes de ponerlo voy a daros un poco de contexto; queremos buscar en nuestra carpeta de backups (/var/backups) los ficheros con la extensión csv que contengan el valor John Doe en alguna parte. Dicho esto vamos al comando:
$ find /var/backups -name "*.csv" | while read fichero
do
if grep "John Doe" "$fichero" >/dev/null
then
echo "$fichero"
fi
done
Muy bien Abel…pero…¿qué es esto que me estás contando?, bien vamos por partes:
-
Comando find:
- Aquí estamos buscando en la ruta /var/backups todos los ficheros que cumplen la condición de tener la extensión csv
-
Comando while:
- Aquí lo que estamos haciendo es mediante el pipe | enviarle al comando while como entrada cada linea de la devuelta por el comando find
- Cada línea que lee el comando while almacena el valor en la variable fichero
-
Comando grep:
- El comando grep busca dentro del fichero recibido como parámetro el texto también indicado en el parámetro, en este caso le estamos que dentro de la ruta que está en la variable fichero busque a ver si existe el texto John Doe
- Por defecto el comando grep devuelve la linea por pantalla, como eso nos generará confusión en la consola redireccionamos la salida a /dev/null para que no se muestre
-
Comando condicional if:
- Usado conjuntamente con el grep que además de la salida por pantalla devuelve un valor de salida, si este valor de salida es mayor a 0, se considera un true y por ello ejecutaría el echo “$fichero”
Tip: Si no te apetece estar escribiendo este rollo, siempre puedes usar la versión agregada del comando grep
grep -l "John Doe" `find . -name "*.csv"`
Consideraciones finales
Sé que el comando find tiene muchísimas más opciones, las iré contando en diferentes artículos, pero de momento solo quiero dejaros un par de concluciones:
- el comando find es increíblemente potente
- podéis concatenar todos los flag que queráis por ejemplo, puede que queramos buscar todos los ficheros con la extensión csv, mayores a 500MB que contengan el texto “2020-12-31” para identificar las transacciones que se realizaron el último día del año. Para eso podríamos ejecutar el siguiente comando:
grep -l "2020-12-31" `find . -name "*.csv" -size +500M`