Rebuscando archivos con un determinado contenido en Linux

Introducción

Cualquier cosa que quieras hacer la puedes hacer con el terminal, así de sencillo es el tema. Está claro, que estamos acostumbrados al entorno gráfico, cada vez se presentan herramientas mas visuales y potentes, que permiten hacer cualquier trabajo administrativo que queramos con nuestros archivos, pero, siempre estará el terminal, y es que, la cantidad de herramientas que tienes a tu disposición es impresionante, y algunas (muchas) con un gran potencial. Tengo claro, que a los usuarios nuevos, a los que vienen de otros Sistemas Operativos, esto les resulte un poco duro, pero, con un poco de paciencia, puedes sacar mucho mas provecho del que te puedes imaginar.

Todo esto viene, porque actualmente tengo un pequeño problema con el manejo del Anillo de Claves de Gnome desde Python, en particular utilizando introspección, lo cual genera un error. He estado mirando otros proyectos para ver como lo han solucionado, pero por ahora no he encontrado ninguna respuesta. Es en este punto donde he tenido que echar mano de «grep», para buscar palabras en el interior de cientos de archivos, en lugar de ir abriendo uno a uno para ver cual es el que contiene la respuesta a mis preguntas.

Grep

Grep es una herramienta accesible desde el terminal, que lo que hace es, buscar en cada uno de los archivos que le pasemos como argumento, en busca de una palabra o patrón. Un patrón por ejemplo sería «c*a», de esta forma nos listaría todas las líneas de un archivo que tuvieran palabras que empiecen por «c» y terminen por «a».

Como comento, en mi caso, el uso que le estaba dando era buscar archivos que contuvieran la palabra «keyring». Los archivos se encontraban organizados en varios directorios y subdirectorios, así que el comando con los argumentos empleados fue:

grep -R -i -n 'keyring' *

Donde:
-R es para que haga una búsqueda recursiva en el directorio desde donde lanzamos el comando, y todos los directorios contenidos en él, y en los que a su vez contengan.
-i es para que ignore mayúsculas y minúsculas (Esto por si acaso, de cualquier forma si en la primera respuesta obtienes muchos resultados siempre puedes lanzarla nuevamente si esta opción)
-n para que indique la línea en la que aparece la palabra que estamos buscando.

Conclusiones

Por aquello de la inconsciencia, he empezado abriendo los archivos uno por uno, y buscando la cadena, pero al poco tiempo (10 minutos como mínimo), me he dado cuenta de lo absurdo de mi acto. De hacerlo de una forma a otra, evidentemente el tiempo que te ahorras no tiene precio, claro. Lo otro es probablemente de las cosas mas absurdas que se pueden hacer.

No me he parado a buscar una herramienta gráfica que haga la misma operación, pero desde luego con esta herramienta es cuestión de segundos (dependiendo de la amplitud de la búsqueda, claro), localizar lo que buscas.

2 comentarios en “Rebuscando archivos con un determinado contenido en Linux

  1. Cex hace 10 años

    De manera gráfica existe un complemento para gEdit llamado GDP Find. Se encuentra dentro del paquete gedit-developer-plugins.

    Otras alternativas son: Gnome-search-tool, Catfish, Pcmanfm-Search Beagle Search, Tracker…

    Hatteras hizo una recopilación en:
    http://hatteras.wordpress.com/2011/09/21/buscar-archivos-en-el-sistema/
    http://hatteras.wordpress.com/2011/09/26/buscar-archivos-en-el-sistema-2/

    Creo que Ubuntu debería incluir Tracker para mostrar en el tablero también archivos que no se hayan abierto; ahora mismo solo se muestran archivos que Zeitgeist haya indizado, es decir, que se hayan abierto.

    También estaría bien una lupa para buscar dentro del contenido de documentos, hojas de cálculo, PDF, etc.

    P.D.: grep tiene una curiosa etimología.

  2. Manuel Vega hace 10 años

    Buen día Atareao, no quiero sonar necio, pero el patrón ejemplo (o expresión regular ejemplo, para los más puristas) que utilizaste no hace exactamente lo que dices, el patrón «c*a» listaría todas las líneas que contengan la «a», sin importar en qué posición,  El motivo del fallo es que el símbolo «*» hace que sean admisibles cualquier cantidad (incluyendo cero) de caracteres «c» que se encuentra en este ejemplo a la izquierda del «*». Para obtener una lista de las líneas que tuviesen  palabras que inician con «c» y terminan con «a», el patrón correcto tendría un poco más complejo, algo parecido a:
    «( +|^)c.*a( +|$)», que aún no es del todo correcto porque no funciona en el caso de palabras que inmediatamente después de ellas lleven algún símbolo de puntuación.
    Saludos,

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *