トラッカーを使用してファイル名のパターンに制限されたテキストをドキュメントで検索する方法

トラッカーを使用してファイル名のパターンに制限されたテキストをドキュメントで検索する方法

ドキュメント (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

関連情報