Este es uno de los capítulos del tutorial El terminal. Encontrarás los enlaces a todos los de capítulos, al final de este artículo.
Una de las operaciones mas habituales que siempre terminas haciendo es la búsqueda. Me refiero a buscar archivos en Linux. No solo se trata de que no sepas donde has dejado un determinado archivo o documento, también buscas donde hay un determinado archivo de configuración. Pero no solo se trata de esto, sino que en ocasiones, esta búsqueda es un paso intermedio para hacer posteriores operaciones. Es decir, utilizar esta búsqueda como un filtro. Aplicar determinadas operaciones a todos aquellos archivos que cumplan con una determinada extensión o ubicación.
De esta manera, en este nuevo capítulo del tutorial encontrarás algunas herramientas que te van a permitir no solo realizar búsquedas, sino además tratar con el resultado de la búsqueda.
Buscar archivos en Linux
Para buscar archivos en Linux tienes dos herramientas fundamentales, locate
y find
. En este sentido, voy a entrar en detalle en ambas herramientas para que puedas sacar el máximo provecho de cada una de ellas. El objetivo, es que encuentres el archivo que busques, por muy escondido que se encuentre.
Buscar con locate
Esta herramienta te permite buscar archivos en Linux rápidamente por el nombre del archivo. Para que esta búsqueda sea efectivamente rápida se realiza una indexación en segundo plano. Esta indexación se hace de forma periódica, diaria o semanalmente. Con ello, indicarte que locate
no busca en tu equipo, sino en una base de datos.
Para forzar la actualización de la indexación, tienes que ejecutar la siguiente orden,
sudo updatedb
Una vez realizada la búsqueda locate
devuelve el nombre de los archivos que cumplen con el patrón específicado.
¿Como especificar lo que buscamos? Tenemos dos opciones, o bien es utilizar comodines o bien expresiones regulares. Si quieres profundizar en esto te recomiendo que le des un vistazo al capítulo del tutorial comodines y expresiones regulares.
Si cuando haces la búsqueda de archivo
no utilizas ningún comodín, locate
entiende que buscas *archivo*
. Eso siempre que no utilices la opción --regex
. Si quieres buscar exactamente archivo
utiliza locate -b '\archivo'
Ten en cuenta de que si locate
encuentra un archivo que cumpla con el patrón que le has indicado, no quiere decir que exista. Simplemente, puedes haberla borrado después de la última indexación realizada.
Es importante que tengas en cuenta que estás buscando en una base de datos donde cada elemento es el nombre del archivo con su ruta completa.
Algunos ejemplos de buscar archivos con locate
A continuación te indico algunos ejemplos que te muestran como utilizar locate
para buscar archivos en Linux.
- Para encontrar todos los archivos que contengan la palabra
usuario
.locate 'usuario'
. - Si no quieres que distinga entre mayúsculas y minúsculas
locate -i 'usuario'
. - Para buscar todos los archivos que sean
/usuario.*
puedes hacerlo conlocate '/usuario.'
o también conlocate --regex '\/usuario\.\S{3}$'
. - Si quieres limitar el número de resultados, tan solo tienes que añadir la opión
-n
. Así por ejemplo si quieres solo los dos primeros resultadoslocate -n 2 'usuario'
. - Por otro lado, si lo único que te interesa es el número de resultados, la opción que debes utilizar es
-c
. Por ejemplolocate -c 'usuario'
. - Como te he indicado, no se comprueba si existe por defecto. Sin embargo puedes modificar este comportamiento utilizando la opción
-e
.
Buscar con find
find
es la herramienta básica para realizar búsquedas en tiempo real en Linux. Me refiero a tiempo real, a que no estás buscando en una base de datos, sino que estás buscando directamente en el sistema de archivos.
Esta herramienta es realmente potente. Así, viene cargada con diferentes opciones que te permitirán personalizar tu búsqueda hasta límites insospechados. Todo esto conlleva que tiene una curva de aprendizaje… pero sinceramente vale la pena.
Para la búsqueda puedes utilizar comodines.
- Te permite buscar por el nombre del archivo
find /directorio -name '*.pdf'
. Si no quieres distinguir entre mayúsculas y minúsculas utiliza-iname
. - También puedes buscar por varios patrones
find /directorio -name '*.pdf' -or -name '*.md'
. - En el caso de que quieras buscar solo archivos, utiliza la opción
-type f
. Por contra si lo que quieres son directorios, la opción que tienes que utilizar es-type d
. - En el caso de que quieras utilizar un patrón para la ruta, la opción a utilizar es
-path
. - Puedes buscar en función del tamaño del archivo. PAra ello utiliza la opción
-size
. Si el tamaño lo precedes de un signo positivo buscará archivos con un tamaño superior al indicado. Mientras que si es negativo, los archivos deberán tener un tamaño inferior. Por ejemplofind / -iname '*usuario*' -size +1k -size -10M
, buscará aquellas con un tamaño mayor a 1kB y menor a 10MB.
Sin embargo find
no solo se queda en esto sino que va mucho mas allá. También te permite hacer búsquedas por el número de usuario o de grupo. O, por supuesto, utilizando expresiones regulares, que tanto potencial te ofrece. También puedes especificar la máxima y mínima profundidad a la que quieres llegar en la búsqueda.
Por otro lado, tambiés es posible buscar archivos a los que tuviste acceso hace un tiempo con -atime
o que modificaste -mtime
. Incluso buscar solo aquellos que son ejecutables -executable
o que tienes permisos de lectura -readable
. O con permisos específicos con la opción -perm
.
Acciones con find
Además find
nos permite realizar acciones con los resultados encontrados en la búsqueda. Así, algunas opciones son las siguientes,
-delete
borra todos los archivos o directorios resultado de la búsqueda.-exec comando {}
ejecuta el comando sobre el resultado. Se sustituye{}
por el nombre del archivo.
Por ejemplo para cambiar los permisos a todos los archivos a 644
, podemos ejecutar,
find . -type f -exec chmod 644 {} \;
El mismo caso para directorios y estableciendo los permisos a 755
,
find . -typedf -exec chmod 755 {} \;
Algunos ejemplos de buscar archivos con find
- Para buscar en el directorio que te encuentres
find . -type f -name "usuario*"
. Busca cualquier archivo en el directorio actual y subdirectorios cuyo nombre empieza porusuario
. - Es posible buscar en múltiples directorios
find /home/lorenzo /home/atareao -name "usuario*" -type f
. - Si quieres hacer lo mismo pero sin tener en cuenta mayúsculas y minúsculas utiliza
-iname
en lugar de-name
. - Si quieres buscar todos aquellos que no cumplan un determinado patrón
find -type f -not -name "*.md"
- Para co(piar todos tus archivos
mp3
a tu directorio deMúsica
find -type f -iname "*.mp3" -exec cp {} /home/lorenzo/Música \;
. - Para borrar todos los archivos que comiencen con
inic
utilizafind . -type f -name "inic*" -exec rm {} \;
. - Localizar todas los archivos que fueron modificados hace cinco días
find -mtime -5 -type f
Más información,
excelente publicación , lo que buscaba