So verwenden Sie Tracker zum Durchsuchen von Dokumenten nach Text, beschränkt auf ein Dateinamenmuster

So verwenden Sie Tracker zum Durchsuchen von Dokumenten nach Text, beschränkt auf ein Dateinamenmuster

Ich möchte ein Befehlszeilentool, um Dokumente (einschließlich doc, docx, odt) nach einer Zeichenfolge zu durchsuchen und die Ergebnisse basierend auf einem Dateinamenmuster einzuschränken, z. B. „search piano letters“, um in allen Dateien mit „letters“ im Namen nach dem Text „piano“ zu suchen. Der Suchbefehl von Tracker ist gut, gibt aber Treffer für alle übereinstimmenden indizierten Dateien zurück, sodass ich den Wald vor lauter Bäumen nicht sehe. Ich brauche etwas Fokussierteres und möchte Tracker nicht jedes Mal, wenn ich suchen möchte, neu konfigurieren müssen, indem ich eine obskure Einstellungsdatei ändere. Wenn ich nach ASCII-Text suchen würde, wäre es einfach, „grep -r pattern directory“ zu verwenden, aber das funktioniert bei modernen Word-Dokumenten nicht.

Antwort1

Es gibt mehrere Fragen zu diesem Thema (und viele davon als Duplikate markiert), aber keine mit einer zufriedenstellenden Antwort (zumindest für mich). Also habe ich ein Skript namens „search“ geschrieben, um Tracker auszuführen und die Ergebnisse basierend auf Dateinamen zu filtern, die einem bestimmten Muster entsprechen. Mit „tracker search piano -l 1000“ erhalte ich 136 Treffer, was zu viel Rauschen enthält. Mit „search piano letters“ erhalte ich 4 Treffer, die die Dateinamen (als anklickbare Links) gefolgt von der entsprechenden Textzeile anzeigen, was großartig ist.

#! /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

verwandte Informationen