
Quiero una herramienta de línea de comandos para buscar documentos (incluidos doc, docx, odt) para una cadena y limitar los resultados según un patrón de nombre de archivo, por ejemplo, "buscar letras de piano" para buscar el texto "piano" en cualquier archivo. con "letras" en su nombre. El comando de búsqueda del rastreador es bueno, pero devuelve resultados en todos los archivos indexados coincidentes, por lo que no puedo ver la madera de los árboles. Necesito algo más enfocado y no quiero tener que reconfigurar el rastreador modificando algún archivo de configuración oscuro cada vez que quiero realizar una búsqueda. Si estuviera buscando texto ASCII, lo haría simplemente usando "directorio de patrones grep -r", pero esto no funciona en documentos de Word modernos.
Respuesta1
Hay varias preguntas sobre este tema (y muchas marcadas como duplicadas) pero ninguna con una respuesta satisfactoria (al menos para mí). Así que escribí un script llamado "búsqueda" para ejecutar el rastreador y filtrar los resultados según los nombres de archivos que coincidan con un patrón determinado. Al utilizar "tracker search piano -l 1000", obtengo 136 resultados que incluyen demasiado ruido. Al utilizar "buscar letras de piano", obtengo 4 resultados que muestran los nombres de los archivos (como enlaces en los que se puede hacer clic) seguidos de la línea de texto relevante, lo cual es genial.
#! /bin/bash
#
# Use "tracker" to search files for content matching a pattern.
# (tracker indexes files by content, including text in MS Word documents.)
# Optionally filter on file pathnames matching another pattern.
#
# Synopsis:
# search content-pattern [path-pattern]
Usage="Usage: ${0##*/} content-pattern [path-pattern]"
case $# in
(1)
IfPathPattern=false
;;
(2)
IfPathPattern=true
;;
(*)
echo "$Usage" >&2
exit 2
;;
esac
tracker search -l 1000 "$1" |
if $IfPathPattern
then
awk -v pattern="$2" '
BEGIN {pattern=tolower(pattern)}
{text=tolower($0)}
lines>0 {print; lines--}
text~pattern {print; lines=2}'
else
cat
fi