lunes, 17 de agosto de 2015

Localizar ficheros en Linux

Un programa que me parece una maravilla en Windows es Everything, y no he encontrado nada en Linux que se le parezca. No concibo una sesión de trabajo en mi ordenador Windows sin este programa. Ojalá aparezca algo similar para Linux.

Pero no todo está perdido en Linux. Aquí tenemos el programa locate, con el que podemos hacer cosas "parecidas" (aunque ya quisiera yo que tuviera la potencia y el bajo impacto en memoria y procesador que tiene Everything).

Un ejemplo: para localizar todos los ficheros de configuración de MySQL que hay en mi equipo, escribiría algo así:

$ locate my.cnf

Y la salida es algo como esto:

Fig. 1. Localizando todos los ficheros "my.cnf" en mi equipo

Si además quiero abrirlos todos ellos en un único paso, podemos hacer

$ locate my.cnf | xargs gedit

Y se nos abriría una ventana como esta

Fig. 2. Todos los ficheros my.cnf abiertos en gedit

Ojo: esto funciona porque gedit acepta múltiples parámetros en la línea de invocación. Si el visor que vamos a utilizar no soporta múltiples parámetros, habría que hacerlo de otra manera.

El nombre que se le pasa como argumento a locate es un patrón, no tiene por qué ser el nombre literal. Esto quiere decir que buscará ficheros que contengan el patrón especificado en su nombre. Por ejemplo, podríamos haber listado los ficheros anteriores tecleando un carácter menos:

$ locate my.cn

Y el resultado sería el mismo, ya que los ficheros implicados CONTIENEN el patrón especificado

Fig. 3. Todos los ficheros my.cn* del equipo

Fijaos que el patrón no es exactamente una expresión regular, ya que no hace falta poner el * para indicar que puede haber más caracteres después de la "n" y, sin embargo, así es cómo locate hace la búsqueda.

Si elimino la letra "n" del patrón, podemos ver que aparecen más ficheros

Fig. 4. Aparecen otros ficheros que coinciden con el patrón *my.c*

O sea, que es como si el patrón tuviera al principio y al final un * (o, para los que estáis más habituados al mundo SQL, como si se hiciera una búsqueda LIKE '%PATRON%')

Así, por ejemplo, si quiero buscar todos los ficheros JPG que tengo en el equipo, no hay que buscar con el patrón *.jpg, sino simplemente teclear

$ locate .jpg

Fig. 5. Listado de ficheros .jpg existentes en mi equipo

Y si lo que quiero es contar cuántos ficheros JPG tengo en el equipo, puedo añadir esto:

$ locate .jpg | wc -l

Fig. 6. ¿Más de 2.000 imágenes????



Si queremos, podemos utilizar expresiones regulares en el patrón utilizando la opción --regex. Así, para buscar todas las imágenes JPG que empiezan por "yellow" pondríamos algo como

$ locate --regex yellow.*.jpg

Y el resultado, en mi equipo, son dos ficheros

Fig. 7. Las imágenes JPG que comienzan por "yellow*"

Que podríamos haber abierto así:

$ locate --regex yellow.*.jpg | xargs eog

Ojo: he utilizado como visor de las imágenes eog (Eye of Gnome) ya que éste soporta múltiples ficheros en una invocación. Sin embargo, shotwell, el visor por defecto de Ubuntu, no los soporta y daría un mensaje diciendo que hay parámetros de más en la invocación.

Al contrario que Everything, que monitoriza el sistema de ficheros constantemente (algo posible gracias al journal de NTFS), la base de datos de locate no se actualiza con tanta frecuencia. Ahora no tengo tiempo de investigarlo, pero me da a mí que se actualiza en cada reinicio del sistema. Lo que sí se puede hacer es actualizarla a mano con el comando updatedb:

Fig. 8. Actualizar a mano la BD de locate

(Lo de "sudo" he tenido que ponerlo porque si no me daba problema al crear algún fichero temporal).



Bueno, pues dicho todo lo anterior, ya podéis buscar rápidamente todos esos ficheros que os gustaría renombrar, por si las moscas...

Fig. 9. Ficheros que hay que renombrar urgentemente

No hay comentarios:

Publicar un comentario