Как использовать трекер для поиска документов по тексту, ограниченный шаблоном имени файла
Мне нужен инструмент командной строки для поиска документов (включая doc, docx, odt) по строке и ограничения результатов на основе шаблона имени файла, например, "поиск букв пианино" для поиска текста "фортепиано" в любом файле с буквами в названии. Команда поиска трекера хороша, но возвращает совпадения по всем соответствующим индексированным файлам, поэтому я не вижу дрова для деревьев. Мне нужно что-то более сфокусированное, и я не хочу перенастраивать трекер, изменяя какой-то непонятный файл настроек каждый раз, когда я хочу искать. Если бы я искал текст ASCII, это было бы просто, используя "каталог шаблонов grep -r", но это не работает на современных текстовых документах.
1 ответ
Есть несколько вопросов на эту тему (и многие отмечены как дубликаты), но ни один из них не имеет удовлетворительного ответа (по крайней мере, для меня). Поэтому я написал скрипт под названием "поиск" для запуска трекера и фильтрации результатов по именам файлов, которые соответствуют заданному шаблону. Используя "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