Buscando ficheros por nombres
Probablemente puedes recordar este problema: Tenías algún tipo de fichero y no podías recordar donde lo pusiste.
Aquí es donde el comando find viene
a ser útil. ¿Cómo usarlo? find viene, por supuesto,
con un extenso man page pero veamos unos «casos típicos»: Buscar
un archivo llamado lostfile.txt, recorriendo el árbol de directorios
comenzando en el directorio actual:
find . -name lostfile.txt -print
find acepta también wildcards. Recuerda
colocar entre comillas los wildcards, de lo contrario el shell no los reconocerá
como tales. Aquí un ejemplo:
find . -name «lost*» -print
Este comando puede ser un poco lento cuando
necesites buscar en un árbol de directorios muy grande. Aquí
el comando locate puede ayudar. Este realmente no busca directamente un
archivo en el sistema de ficheros. Busca en una base de datos. Es bastante
más rápido pero la base de datos podría estar desactualizada.
En algunas distribuciones la base de datos localizada es actualizada cada
noche pero puedes, por supuesto, correr el comando updatedb manualmente
de vez en cuando para actualizarla. locate realiza búsquedas de
subcadenas.
locate lostfile
Este localiza los ficheros lostfile.txt
o mylostfile.txt, etc…
Hasta ahora estabamos buscando ficheros
de los cuales teníamos una remota idea de sus nombres. Tal vez el
nombre del archivo no era lostfile.txt sino lastfile.txt
o leastfile.txt o lostfile.txt o Lostfile.txt o lostfile.text
y no puedes recordar exactamente el nombre. ¿Cómo podrías
encontrar el archivo aún? en este caso podrías usar una utilidad
para encontrar ficheros que tolera fallas en la escritura del nombre llamada
ftff (fault tolerant file find). Esta utilidad busca el archivo y permite
un número de «errores en la escritura». Este comando encontraría
los nombres mal escritos de los ficheros:
ftff lostfiles.txt
El número permitido de errores en
la escritura del nombre depende del largo del mismo pero también
puede establecerse con la opción -t. Para permitir un máximo
de 2 errores y usar también un wildcard, sólo tipea:
ftff -t2 «lostfiles*»
ftff es un programa de mi autoria y forma
parte de un paquete llamado whichman-1.4 que puede ser bajado de
sunsite.unc.edu/pub/
Linux/apps/doctools/whichman-1.4.tar.gz
Algunas veces te gustaría encontrar
todos los ficheros en el árbol de directorios que no contengan cierta
cadena. Por ejemplo todos los ficheros excepto .o y .c. Aquí están
un par de posibilidades para hacerlo::
find . ! -name «*.o» ! -name «*.c» -print
find . -print | fgrep -v ‘.o’ | fgrep -v ‘.c’
si tienes la versión gnu de
find:
find | fgrep -v ‘.o’ | fgrep -v ‘.c’
find | egrep -v ‘.[oc]’
Obteniendo una vista completa del
sistema de ficheros
Algunas veces te agradaría tener
una visión total del sistema de ficheros frente a ti. Por ejemplo:
Tienes un nuevo CD y quisieras ver que es lo que tiene. Podrías
usar solamente
ls -R. Personalmente prefiero por fácil lectura
uno de los siguientes: tree dibuja un diagrama de árbol (sunsite.unc.edu/pub/Linux/utils/file/
tree-1.2.tgz ).
tree
o con nombres largos de archivo:
tree -fF
También está por supuesto,
el viejo, pero buen find. La versión GNU de find, que viene usualmente
con Linux, también tiene la posibilidad de cambiar el formato de
impresión para imprimir, por ejemplo el tamaño del archivo
con el nombre:
find . -ls
find . -print o con gnu find:
find
find . -printf «%7s %p
«
Hay también un pequeño programa
en perl usando el comando ls que hace cosas similares. Se puede bajar de
aquí: lsperl. Puedes encontrar probablemente
muchas más herramientas para ver ficheros pero ésta es, para
la mayoría de los casos, suficiente.
Encontrando ficheros por contenido
(buscando cadenas de texto en ficheros)
La utilidades standard para buscar cadenas
de texto en ficheros son grep/egrep para la búsqueda de expresiones
regulares y fgrep para buscar cadenas literales. Para buscar una expresión
en todos los ficheros del directorio actual sólo tipea:
egrep -i «search expression» *
Para buscar cadenas en todos los ficheros
de todo el árbol de directorios puedes combinar el comando find
con otro comando de búsqueda de archivo, por ejemplo: egrep. Esto
puede ser realizado de muchas formas:
egrep -i «expression» `find . -type f -print`
find . -type f -exec egrep -i «expression» /dev/null {} ;
find . -type f -print | xargs egrep -i «expression»
Si encuentras ésto díficil
de recordar entonces puedes usar un pequeño shell script que puedes
encontrar aquí grepfind Este script
también se asegura que caracteres no imprimibles sean removidos
en caso de que ejecutes egrep en un archivo binario.
Un programa de búsqueda muy interesante
es agrep. Este funciona básicamente como egrep pero realiza búsquedas
que toleran errores en la escritura del nombre. De esta manera puedes también
encontrar palabras mal escritas. Para buscar una expresión con un
máximo de dos errores de escritura puedes usar:
agrep -i -2 «search exprission» *
El programa agrep puede ser bajado de sunsite
sunsite.unc.edu/pub/Linux/util
s/text/agrep-2.04.tar.Z o de su sitio original ftp://ftp.cs.arizona.edu/agrep/
También está glimpse. Esta
es una poderosa utilidad de búsqueda. Utiliza un concepto similar
a locate. Primero una base de datos necesita ser construida, para que la
búsquedas sean rápidas. Para construir una búsqueda
indexada del contenido de todos los ficheros empezando en el directorio
actual:
glimpseindex .
Después de eso puedes buscar una
cadena en todos los ficheros que fueron previamente indexados
glimpse -i -2 «search exprission»
glimpse también tolera errores de
escritura (como agrep) y el -2 permite dos errores. glimpse está
disponible en http://glimpse.cs.arizona.edu/
Hay muchas utilidades de búsqueda
disponibles para Unix y Linux especialmente. Por lo tanto este artículo
no puede estar completo. Si estas interesado en más trucos y utilidades
como éstas echa un vistazo en los ficheros .lsm en ftp://sunsite.unc.edu/pub/Linux/utils
Autor: Guido Shocher, LinuxFocus
Traducido por Ruben Sotillo
¡claro que me ha sido util…! Gracias.
Hacen falta mas ejemplos como estos…
para que uno se familiarice con la linea de comandos… 🙂
Gracias…
m