Como usar o rastreador para pesquisar texto em documentos, restrito a um padrão de nome de arquivo

Como usar o rastreador para pesquisar texto em documentos, restrito a um padrão de nome de arquivo

Quero uma ferramenta de linha de comando para pesquisar documentos (incluindo doc, docx, odt) em busca de uma string e limitar os resultados com base em um padrão de nome de arquivo, por exemplo, "pesquisar letras de piano" para pesquisar o texto "piano" em qualquer arquivo com "letras" em seu nome. O comando de pesquisa do rastreador é bom, mas retorna resultados em todos os arquivos indexados correspondentes, então não consigo ver a madeira das árvores. Preciso de algo mais focado e não quero reconfigurar o rastreador modificando algum arquivo de configuração obscuro toda vez que quiser pesquisar. Se eu estivesse procurando por texto ASCII, seria simples usar o "diretório padrão grep -r", mas isso não funciona em documentos do Word modernos.

Responder1

Existem diversas perguntas sobre esse assunto (e muitas marcadas como duplicadas), mas nenhuma com resposta satisfatória (pelo menos para mim). Então escrevi um script chamado "search" para executar o rastreador e filtrar os resultados com base em nomes de arquivos que correspondam a um determinado padrão. Usando "tracker search piano -l 1000", recebo 136 ocorrências, o que inclui muito ruído. Usando "pesquisar letras de piano", recebo 4 resultados mostrando os nomes dos arquivos (como links clicáveis) seguidos pela linha de texto relevante, o que é ótimo.

#! /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

informação relacionada