web-dev-qa-db-ja.com

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

コマンドラインツールでドキュメント(doc、docx、odtを含む)で文字列を検索し、ファイル名のパターンに基づいて結果を制限します。たとえば、「ピアノの文字を検索」で任意のファイルの「ピアノ」というテキストを検索します。名前に「文字」が含まれています。トラッカー検索コマンドは優れていますが、一致するすべてのインデックスファイルでヒットを返すため、ツリーのウッドが表示されません。もっと焦点を絞ったものが必要で、検索するたびにあいまいな設定ファイルを変更してトラッカーを再構成する必要はありません。 ASCII textを検索した場合、「grep -r pattern directory」を使用すると簡単になりますが、これは最新のWord文書では機能しません。

1
Jeffrey Ross

この問題にはいくつかの質問があります(多くは重複としてマークされています)が、満足のいく答えはありません(少なくとも私にとって)。そこで、トラッカーを実行し、特定のパターンに一致するファイル名に基づいて結果をフィルタリングする「検索」というスクリプトを作成しました。 「トラッカーサーチピアノ-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
2
Jeffrey Ross