私はOpenSUSE10.3を使用しており、ディレクトリ内の多数のpdfファイル内のフレーズを検索するためのコマンドラインツールを知りたいです。 Windowsの場合XP Explorerの検索ではこれが許可されますが、速度が遅すぎます。ここにgrepのヒントはありますか?
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); } '
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ファイル内だけでなく、コマンドラインプログラムではなく、ディレクトリ全体とサブディレクトリの下での検索を可能にします。
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
」に変更すると、このインスタンスでも同じ結果が得られます。./
’)になります。この例では、「/
」が現在のユーザーのホームディレクトリの絶対パスに展開され、これが唯一のパスであるため、照合されるパスはすべて絶対パスです(つまり、「~/
」で始まります)。引数。$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
によって認識されないようです。
もちろん、ニーズに合わせて調整してください。