Cansado de lidiar con las complejidades y deficiencias de otros programas de la misma categoría, me propuse escribir mi propio programa buscador de archivos, armado de Python y Gedit, mi lenguaje de programación y editor de texto favoritos, respectivamente.
Mi propósito era simple: contar con una utilidad de línea de comando que genere una lista de los archivos que contengan en su nombre o trayectoria una secuencia de caracteres suministrada como parámetro.
El resultado se llama hay, y se puede descargar haciendo click al mismo nombre, o mejor aún, instalarlo directamente desde la línea de comando siguiendo las instrucciones detalladas a continuación:
mkdir hay cd hay wget http://www.zayas.org/carlos/wp-content/uploads/2012/02/hay.zip unzip hay.zip sudo cp hay.py /usr/bin/hay sudo chmod +x /usr/bin/hay
Cabe aclarar que el programa hay requiere de un sistema operativo tipo UNIX con Python instalado, como por ejemplo cualquier distro moderna de GNU/Linux, entre ellas Fedora o Ubuntu.
Una vez realizada la instalación, el uso de hay es trivial:
De manera predeterminada, la búsqueda se realiza dentro de la carpeta personal del usuario que ejecuta el programa. Si se desea apuntar a otra dirección, basta con indicarlo en un segundo parámetro.
Listado completo del programa:
#!/usr/bin/env python
#-*- coding: utf-8 -*-
# -----------------------------------------------------------------------------
# Hay - Version 0.1 - 23/02/2012
# Carlos Zayas Guggiari (carlos@carloszayas.com)
# python --version : Python 2.7.2+
# -----------------------------------------------------------------------------
import os, sys, string, fnmatch
# -----------------------------------------------------------------------------
def hay(patron, raiz=os.curdir):
'Devuelve todos los archivos que coinciden con el patron suministrado.'
#--------------------------------------------------------------------------
# Se inserta una expresion regular en el patron para tratar las letras
#--------------------------------------------------------------------------
cadena = ''
for caracter in patron:
if caracter in string.letters:
cadena += '['+caracter.upper()+caracter.lower()+']'
else:
cadena += caracter
patron = '*'+cadena+'*'
#--------------------------------------------------------------------------
# Se "cede" (yield) cada archivo que cumple con el patron
#--------------------------------------------------------------------------
for camino, carpetas, archivos in os.walk(os.path.abspath(raiz)):
for archivo in fnmatch.filter(archivos, patron):
yield os.path.join(camino, archivo)
# -----------------------------------------------------------------------------
def main():
'Funcion principal.'
args = sys.argv
prog = args.pop(0).split('/')[-1]
raiz = os.path.expanduser('~')
if args:
patron = args.pop(0)
if args: raiz = args.pop(0)
lista = hay(patron,raiz)
for item in lista: print item
else:
print 'Sintaxis:',prog,'patron de busqueda [ubicacion inicial]'
# -----------------------------------------------------------------------------
# Si no se importa como modulo, se ejecuta la funcion principal
# -----------------------------------------------------------------------------
if __name__ == '__main__': main()









