私はopensuse 10.3を使用しており、ディレクトリ内の多数のpdfファイルでフレーズを検索するコマンドラインツールについて知りたいと思っています。Windows XPでは、エクスプローラー検索でこれが可能ですが、遅すぎます。ここにgrepのヒントはありますか?
私はopensuse 10.3を使用しており、ディレクトリ内の多数のpdfファイルでフレーズを検索するコマンドラインツールについて知りたいと思っています。Windows XPでは、エクスプローラー検索でこれが可能ですが、遅すぎます。ここに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の可能なリストを見つける 「$ SEARCH_DIR」を見つけます-type f -name '* .pdf'> list-of-pdf.txt
#すべてがawkによってダクトテープとして結合され、処理のためにbashに送信されます #二重引用符はawk内でx22としてエスケープされます。 「$ 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なし。ニーズに合わせたさらなるプロセス 「$ 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){ 印刷 "ファイル[" $ 0 "の場合] [[ret]]に一致します"; #好きなことをしてください。 }; close(EXEC); } '
LinuxとWindowsの両方で、複数のファイルを検索するコマンドがあるAcrobat Readerを使用できます。
Linuxでは、Recollがあり、初めて実行したときにPDFファイル(およびその他)のインデックスが作成されます。インデックスが作成された後、単語検索は非常に高速になるはずです。フレーズ検索は合理的でなければなりません。pdftotext
Recollを開始する前に、コマンドがインストールされていることを確認してください。DebianとUbuntuでは、poppler-utils
パッケージに含まれています。Suseについては知りません。
または、ファイルを直接テキストに変換し、以下のコマンドを使用してテキストファイルでgrepを使用することもできます。
find -name '* .pdf' -exec pdftotext {} \; grep -r --include '* .txt' -l -F "検索する完全なフレーズ" grep -r --include '* .txt' -l -E "検索する正規表現"
pdftotext
います(Recollなどのツールが自動的に実行します)。
[iI]n Haskell
たとえば、PDFファイル拡張子があり、正規表現「」に一致する行を含む、ホームディレクトリ内のすべてのファイルを再帰的に一覧表示するには、次のコマンドを発行できます。
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}
'はの最初の2文字$0
、つまり' 'を削除しますが、./
によって認識されないようsh
です。
もちろん、必要に応じて調整してください。