![如何使用跟踪器在文档中搜索文本(仅限于文件名模式)](https://linux22.com/image/1157805/%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8%E8%B7%9F%E8%B8%AA%E5%99%A8%E5%9C%A8%E6%96%87%E6%A1%A3%E4%B8%AD%E6%90%9C%E7%B4%A2%E6%96%87%E6%9C%AC%EF%BC%88%E4%BB%85%E9%99%90%E4%BA%8E%E6%96%87%E4%BB%B6%E5%90%8D%E6%A8%A1%E5%BC%8F%EF%BC%89.png)
我想要一个命令行工具来在文档(包括 doc、docx、odt)中搜索字符串,并根据文件名模式限制结果,例如“搜索钢琴字母”可以在名称中包含“字母”的任何文件中搜索文本“钢琴”。跟踪器搜索命令很好,但会返回所有匹配的索引文件的匹配项,所以我看不到树木的森林。我需要一些更有针对性的东西,我不想每次想要搜索时都必须通过修改一些晦涩难懂的设置文件来重新配置跟踪器。如果我要搜索 ASCII 文本,只需使用“grep -r 模式目录”即可,但这不适用于现代 word 文档。
答案1
关于这个问题有几个问题(其中很多被标记为重复),但没有一个有令人满意的答案(至少对我来说)。所以我写了一个名为“搜索”的脚本来运行跟踪器并根据与给定模式匹配的文件名过滤结果。使用“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