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


9

私はopensuse 10.3を使用しており、ディレクトリ内の多数のpdfファイルでフレーズを検索するコマンドラインツールについて知りたいと思っています。Windows XPでは、エクスプローラー検索でこれが可能ですが、遅すぎます。ここにgrepのヒントはありますか?



最初にコマンドラインツールについて知りたいのですが、GUIツールがあれば、それもいいでしょう。WingrepはWindowsでのみ動作します。そして、私はPDFファイルのみを検索したいので、そのために最適化されたアプリケーションがあればよいでしょう
iceman

回答:


6
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);
} '

「Windows XP」windows-searchタグに関する質問の一部に気づかなかったと思います。「openSUSE」で始まった質問を(混乱して)知っていますが、LinuxのリファレンスよりもWindowsのリファレンスの方が多いです。特に彼のその後のコメントも数えるとき。
Synetech 2012

@Synetech:彼は「WingrepはWindowsでのみ存在する」という回答を拒否しました。これは、Linuxソリューションが必要であることを示唆しています。
メカニカルカタツムリ

@Mechanicalsnail、彼はそれがコマンドラインツールを求めているGUIツールであるため、それを拒否しました。
Synetech 2012

3

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

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

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

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

adobeは、ディレクトリ全体の下での検索を許可しません。ファイル内だけで検索します。最初にコマンドラインツールについて知りたいのですが、GUIツールがあればそれもいいでしょう
iceman

LinuxでのAdobe Reader 9には、「編集|検索」メニューエントリがあり、ディレクトリ内のすべてのPDFファイルを検索できます。コマンドラインで、私が認識しているすべての方法には、ステップが含まれてpdftotextいます(Recollなどのツールが自動的に実行します)。
Gilles「SO-邪悪なことをやめなさい」10/07/13

1
Recollの+1。ファイルがたくさんあり、頻繁に検索する場合、ファイルのインデックスを作成すると時間を節約できます。
メカニカルカタツムリ

1

Adobe ReaderのXは、仕事をしていませんし、それがないだけでなく、ファイル内に、全体のディレクトリとサブディレクトリの下に検索することができますが、それはコマンドラインプログラムではありません。


Acrobat Xの最新バージョンにありますか?どのリリース?
アイスマン

私はAcrobatのインデックス作成ツールを試してみましたが、それをプリミティブと呼ぶのはお世辞です。recoll簡単にdebianにインストールしました。現在、私のWindowsベースの従業員が使用できるようにしています。
クリスK

0

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

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

備考:

  • それはこの例のために特に必要はありませんが、私はこれはの使用回避を構築しました-execxargs理由を、セキュリティ上の理由から、私はそれがそうするのが習慣に取得することをお勧めだと思います。この例では、' -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です。

もちろん、必要に応じて調整してください。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.