
ドキュメント (doc、docx、odt を含む) で文字列を検索し、ファイル名のパターンに基づいて結果を絞り込むコマンドライン ツールが必要です。たとえば、「search piano letters」と入力すると、名前に「letters」が含まれるファイルで「piano」というテキストが検索されます。トラッカーの検索コマンドは便利ですが、一致するすべてのインデックス ファイルにヒットするため、全体像が見えません。もっと焦点を絞ったものが必要です。検索するたびに、わかりにくい設定ファイルを変更してトラッカーを再設定する必要はありません。ASCII テキストを検索する場合は、「grep -r pattern directory」を使用すれば簡単ですが、これは最近の Word ドキュメントでは機能しません。
答え1
この件については、いくつかの質問 (重複としてマークされているものも多数) がありますが、どれも満足のいく回答がありません (少なくとも私にとっては)。そこで、tracker を実行して、特定のパターンに一致するファイル名に基づいて結果をフィルターする「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