web-dev-qa-db-fra.com

Comment utiliser le tracker pour rechercher des documents pour du texte, limité à un modèle de nom de fichier

Je souhaite qu'un outil en ligne de commande recherche des documents (y compris doc, docx, odt) pour une chaîne et limite les résultats en fonction d'un modèle de nom de fichier, par exemple "rechercher les lettres du piano" pour rechercher le texte "piano" dans n'importe quel fichier avec "lettres" dans son nom. La commande de recherche du tracker est bonne, mais renvoie des hits sur tous les fichiers indexés correspondants, donc je ne peux pas voir le bois pour les arbres. J'ai besoin de quelque chose de plus ciblé, et je ne veux pas avoir à reconfigurer le tracker en modifiant un fichier de réglage obscur chaque fois que je veux effectuer une recherche. Si je cherchais du texte ASCII, ce serait simple en utilisant "grep -r pattern directory" mais cela ne fonctionne pas sur les documents Word modernes.

1
Jeffrey Ross

Il y a plusieurs questions à ce sujet (et beaucoup marquées comme doublons) mais aucune avec une réponse satisfaisante (du moins pour moi). J'ai donc écrit un script appelé "recherche" pour exécuter tracker et filtrer les résultats en fonction des noms de fichiers qui correspondent à un modèle donné. En utilisant "tracker search piano -l 1000", j'obtiens 136 hits qui incluent trop de bruit. En utilisant "rechercher les lettres du piano", j'obtiens 4 résultats affichant les noms de fichiers (sous forme de liens cliquables) suivis de la ligne de texte appropriée, ce qui est génial.

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