Buscar de forma rápida las palabras que quieras dentro de tus documentos
Tengo unos cuantos miles de ficheros de texto del tipo .txt .adoc .md .sh
Muchas veces me surge la duda de cómo resolví tal problema o dónde anoté aquella incidencia.
He pasado ya por muchas formas de tener almacenada la información, muchos tipos de wikis. Obsidian es ahora la que está de moda y parece la más avanzada hoy.
Pero sin duda para mi la mejor sigue siendo https://tiddlywiki.com/. Tener todo en un fichero local html sin necesidad de servidor es una ventaja. Y su búsqueda es muy buena.
Pero tiene otros inconvenientes. Total que decidí volver a tener toda la documentación en ficheros de texto, sean en formato markdown o asciidoc. Los ficheros de texto son atemporales "informáticamente" hablando, ligeros, cómodos de editar, reutilizables.
¿y cómo buscar dentro de todos esos ficheros?
Con bash y herramientas gnu. Este script lo podemos lanzar de forma
busca <palabra1> <palabra2> ... <palabra.n>
El motor es grep
```
grep --include=\*.{md,adoc,txt,sh} --exclude="encontrado.md" --exclude-dir={"DOIT","blog"} -Ril $1 ~/Documentos/ > zbusca
```
para luego hay que hacer búsquedas recursivas de cada palabra.
```
for i in $palabras
do
cat $ant | xargs grep -li $i 2>/dev/null > zbusca$i
ant=zbusca$i
done
```
y nos devolverá un fichero html con todos los ficheros que contienen todas las palabras buscadas (AND no OR), y los registros son linkables de forma que al pinchar sobre ellos nos mostrará el contenido. Ese fichero de resultados lo genero en markdown y luego convierto con pandoc a html.
En el script se define y ofrece:
- qué tipo de extensiones tienen los ficheros a rebuscar
- desde qué carpeta empezamos a buscar
- se pueden excluir carpetas o ficheros para que no mire dentro de ellos
- devuelve fichero con los resultados en markdown y html
- contabiliza el total de ficheros que contienen las palabras buscadas.
Este script funciona en local en el equipo y con el navegador o sin él se pueden ver los resultados.
Pero también necesito hacer esta búsqueda desde fuera de casa, desde el móvil o cualquier ordenador, sin necesidad de VPN pero de forma privada.
Eso me costó más, porque hay muchas soluciones todas ellas con sus ventajas y grandes inconvenientes. Ya veremos si lo cuento.
```
#!/usr/bin/env bash
# Función: busca en todos mis documentos de tipo texto, .md .adoc .txt .sh los argumentos que se le pasen
# Fecha creación: 13.05.2023
# Autor: Julio Briso-Montiano
# Versión: 1.0
# Detalle:
# - meter en .bash_aliases la ruta de este script
# - crea encontrado.md y html en la carpeta de este script con los resultados linkables
# - se ve mejor en chrome que en kate para poder hacer click en los md
#
#set -euo pipefail
filout="/home/julio/Documentos/06-Zaprogramas/bash/buscabash/encontrado.md"
filhtml="/home/julio/Documentos/06-Zaprogramas/bash/buscabash/encontrado.html"
if [ $# -lt 1 ]
then
echo "Formato: ./busca.sh <algo1> <algo2> ...>"
fi
palabras="$@"
#find ~/Documentos -type f \( -name "*.txt" -o -name "*.sh" -o -name "*.md" -o -name "*.adoc" \) -exec grep -l ${1} {} + > zenficheros
# mejor
grep --include=\*.{md,adoc,txt,sh} --exclude="encontrado.md" --exclude-dir={"DOIT","blog"} -Ril $1 ~/Documentos/ > zbusca
ant=zbusca
for i in $palabras
do
cat $ant | xargs grep -li $i 2>/dev/null > zbusca$i
ant=zbusca$i
done
echo -e "Búsqueda de \"""$@""\" encontrados en estos ficheros:\n---\n---\n" > $filout
while IFS= read -r line
do
echo -e "[""$line""](""$line"")" >> $filout
echo -e "\n" >> $filout
done < $ant
echo -e "\n---\n" >> $filout
numero=$(cat $ant | wc -l)
echo -e $numero" encontrados\n" >> $filout
echo $(date) >> $filout
rm zbusca*
pandoc -f markdown -t html5 -o $filhtml $filout
more $filout
```