web-dev-qa-db-ja.com

多数のPDFファイル内のフレーズを検索するためのコマンドラインツール

私はOpenSUSE10.3を使用しており、ディレクトリ内の多数のpdfファイル内のフレーズを検索するためのコマンドラインツールを知りたいです。 Windowsの場合XP Explorerの検索ではこれが許可されますが、速度が遅すぎます。ここにgrepのヒントはありますか?

9
iceman
 SEARCH_DIR = "/ some/dir/where/you/want/to/search/";
SEARCH_STRING=" whatever-you-are-searching "; 
#pdfからテキストを抽出
 pdftotext "file.pdf" "file.txt" 
 
#grep 
 pdftotext "file.pdfに接続"/ dev/stdout | grep -H --label =" file.pdf "-" $ SEARCH_STRING "
 
#一致するPDFファイルのファイルリストのみをgrepに表示する場合は、次を追加します。 --files-with-matches 
 pdftotext "file.pdf"/dev/stdout | grep -H --label = "file.pdf" --files-with-matches-"$ SEARCH_STRING" 
 
#検索するPDFの可能なリストを検索
 find "$ SEARCH_DIR" -type f -name '* .pdf'> list-of-pdf.txt 
#すべてがawkによってダクトテープとして結合され、処理のためにbashに送信されます
#二重引用符はawk内でx22としてエスケープされます。
 find "$ SEARCH_DIR" -type f -name ' * .pdf '| awk -v SEARCH_STRING = "$ SEARCH_STRING"' {
 print "pdftotext\x22" $ 0 "\ x22/dev/stdout | grep -H --label =\x22" $ 0 "\ x22 -\ x22 "SEARCH_STRING"\x22 "
} '| bash 
 
#bashなし。ニーズに合わせたさらなるプロセス
 find "$ SEARCH_DIR" -type f -name '* .pdf' | awk -v SEARCH_STRING = "$ SEARCH_STRING" '
 {
 EXEC = "pdftotext\x22" $ 0 "\ x22/dev/stdout | grep -H --label =\x22" $ 0 "\ x22-\x22" SEARCH_STRING "\ x22"; 
 while(EXEC | getline ret ){
 print "For file [" $ 0 "] we have match [" ret "]"; 
#好きなことをしてください。 
}; 
 close(EXEC); 
} '
6
user42723

LinuxとWindowsの両方で、複数のファイルを検索するコマンドを持つAcrobatReaderを使用できます。

Linuxには、Recollがあります。これは、最初に実行したときにpdfファイル(およびその他)のインデックスを作成します。インデックスが作成された後、Word検索は非常に高速になります。フレーズ検索は合理的でなければなりません。 Recollを開始する前に、pdftotextコマンドがインストールされていることを確認してください。 DebianとUbuntuでは、それはpoppler-utilsパッケージにあり、Suseについてはわかりません。

または、ファイルを直接テキストに変換し、以下のコマンドを使用してテキストファイルでgrepを使用することもできます。

 find -name '* .pdf' -exec pdftotext {} \; 
 grep -r --include '* .txt' -l -F "検索する正確なフレーズ" 
 grep -r --include '* .txt' -l -E "検索する正規表現" 

Adobe Reader Xがその役割を果たし、それはdoesファイル内だけでなく、コマンドラインプログラムではなく、ディレクトリ全体とサブディレクトリの下での検索を可能にします。

1
stendabrog

PDFファイル拡張子を持ち、たとえば正規表現「[iI]n Haskell」に一致する行を含む、ホームディレクトリ内のすべてのファイルを再帰的に一覧表示するには、次のように発行します。

find ~/ -regextype posix-extended -regex '.*\.pdf' -execdir sh -c 'pdftotext "$0" - | grep -El --label="$PWD${0#?}" "$1"' {} '[iI]n Haskell' \;

備考:

  • この例では特に必要ではありませんが、-execまたはxargsの使用を避けてこれを作成しました。これは、 セキュリティ上の理由から 、次のことを行うことをお勧めします。そうする習慣を身につけましょう。 「-execdir」を「-exec」に変更し、「$PWD${0#?}」を「$0」に変更すると、このインスタンスでも同じ結果が得られます。
  • ファイル名のパターンマッチングに globs を使用する代わりに、 正規表現 のより優れた表現力を使用して、パス全体でパターンマッチングを行うと便利な場合があります。私はそれがどのように行われるかを示すためにここに練習を含めました。パターンが一致するパスは、通常印刷されるパスであることに注意してください。相対か絶対かは、指定されたパス引数によって異なります。パス引数は、発行された場合、デフォルトで現在の作業ディレクトリ( ‘./’)になります。この例では、「/」が現在のユーザーのホームディレクトリの絶対パスに展開され、これが唯一のパスであるため、照合されるパスはすべて絶対パスです(つまり、「~/」で始まります)。引数。
  • $0」と「$1」は、引数を正しく引用するように使用される位置パラメータです。これが適切に行われない場合、コマンドは任意のファイル名に対して脆弱です。
  • ${0#?}」は、$0の最初の文字、つまり「.」を削除します。

ファイル名が続く各一致する行を印刷するには:

find ~/ -regextype posix-extended -regex '.*\.pdf' -execdir bash -c 'pdftotext "$0" - | grep -EH --label="${0:2}" "$1"' {} '[iI]n Haskell' \;

このバリアントは、「-H」の代わりに「-l」を使用し、ファイルパスではなくファイル名でラベルを付けます。 ‘${0:2}’は$0の最初の2文字、つまり ‘./’を削除しますが、shによって認識されないようです。

もちろん、ニーズに合わせて調整してください。

0
James Haigh