
我想要一個命令列工具來搜尋文件(包括 doc、docx、odt)中的字串,並根據文件名模式限制結果,例如「搜尋鋼琴字母」以在任何文件中搜尋文字「鋼琴」其名稱中帶有“字母”。追蹤器搜尋命令很好,但返回所有匹配索引檔案的命中結果,因此我看不到樹木的木材。我需要更集中的東西,我不想每次要搜尋時都透過修改一些晦澀的設定檔來重新配置追蹤器。如果我要搜尋 ASCII 文本,使用「grep -r 模式目錄」會很簡單,但這不適用於現代 Word 文件。
答案1
關於這個主題有幾個問題(其中許多被標記為重複),但沒有一個有令人滿意的答案(至少對我來說)。因此,我編寫了一個名為“搜尋”的腳本來運行追蹤器並根據與給定模式匹配的檔案名稱過濾結果。使用“追蹤器搜尋鋼琴 -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