imagen

Buscar de forma rápida las palabras que quieras dentro de tus documentos

21.May.2023 — Julio

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.

web

termina

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

```

Tags: bash, setup

Comments? Tweet