Вопрос Как использовать трекер для поиска документов для текста, ограниченного шаблоном имени файла


Я хочу, чтобы инструмент командной строки выполнял поиск документов (включая doc, docx, odt) для строки и ограничивал результаты на основе шаблона имени файла, например «поиск букв пианино» для поиска текста «фортепиано» в любом файле с «буквами» от его имени. Команда поиска трекера хороша, но возвращает удары по всем соответствующим индексированным файлам, поэтому я не вижу дерева для деревьев. Мне нужно что-то более сосредоточенное, и я не хочу переконфигурировать трекер, изменяя какой-то неясный файл настроек каждый раз, когда я хочу искать. Если бы я искал текст ASCII, это было бы просто с помощью «grep -r pattern directory», но это не работает на современных текстовых документах.


1
2018-06-16 00:30


происхождения




ответы:


Есть несколько вопросов по этому вопросу (и многие отмечены как дубликаты), но нет удовлетворительного ответа (по крайней мере для меня). Поэтому я написал сценарий под названием «поиск» для запуска трекера и фильтрации результатов на основе имен файлов, которые соответствуют заданному шаблону. Используя «tracker search piano -l 1000», я получаю 136 хитов, которые содержат слишком много шума. Используя «поиск букв пианино», я получаю 4 раза, показывая имена файлов (как ссылки с возможностью клика), за которыми следует соответствующая текстовая строка, что отлично.

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

2
2018-06-16 00:43