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