複数のpdfファイルのコンテンツを検索する方法は?


226

ディレクトリ/サブディレクトリ内のPDFファイルのコンテンツを検索するにはどうすればよいですか?コマンドラインツールを探しています。grepPDFファイルを検索できないようです。


5
PDFはバイナリ形式であり、テキストはさまざまな方法で圧縮またはエンコードされることが多いため、Grepは機能しません。
マークスティーブンス

4
これがGUIソリューションです。AdobeReader
Martin Thoma


3
Adobeリーダーは正常に動作しますが、インデックスに登録されません。そのため、多くのファイルがある場合は遅くなります。インデックス作成ソリューションはありますか?
Ruby

回答:


211

ディストリビューションには、次のユーティリティが必要ですpdftotext

find /path -name '*.pdf' -exec sh -c 'pdftotext "{}" - | grep --with-filename --label="{}" --color "your pattern"' \;

「-」は、pdftotextをファイルではなく標準出力に出力するために必要です。--with-filenameおよび--label=オプションのgrepの出力にファイル名を入れます。オプションの--colorフラグは便利で、端末で色を使用して出力するようにgrepに指示します。

(Ubuntuでは、pdftotextパッケージxpdf-utilsまたはによって提供されますpoppler-utils。)

pdftotextand を使用するこの方法は、サポートしていないGNUの機能を使用する場合よりもgrep優れていpdfgrepます。:pdfgrep-1.3.xは、コンテキスト行を印刷するオプションをサポートしています。greppdfgrep-C


1
@Kurt Pfeifle grep印刷されたファイル名をフィルタリングするため、行った編集「(-kp-で編集)」は機能しません。
Raphael Ahrens 2013

@sjrいいえ、このpdfgrepソリューションは本当にすばやく簡単な検索には適していますが、1行では十分ではないため、いくつかのコンテキストを取得したいことがよくあります。この回答に追加したように、たとえば、 「あなたのパターン」の前に-C5オプションを付けて出力に5行のコンテキストを含める-pdfgrepはこれをサポートしていません
Colin D Bennett

おお、それはクールだ。ほとんどの人にとってそれがそれほど明白ではないが、これには利点があることを知ってうれしい
sjr

2
@sjr念のために:私はUbuntuの12.10を使用していpdfgrep無用である、それは扱うことができないファイルにゴミの膨大な量を報告します。一方、あなたの解決策は役に立ちました。ですから、削除しないでください。3年経ってもまだ役に立ちます!
Ali

私はそれをcygwinでも使用することができましたが、 "your_pattern"を '$ 1'にする必要があったパラメーターを使用して関数を作成しました
Koshmaar

214

pdfgrepがあり、その名前が示すとおりに動作します。

pdfgrep -R 'a pattern to search recursively from path' /some/path

私は単純な検索に使用しましたが、うまくいきました。

(Debian、Ubuntu、Fedoraにはパッケージがあります。)

バージョン1.3.0以降、pdfgrepは再帰検索をサポートしています。このバージョンは、Ubuntu 12.10(Quantal)以降のUbuntuで使用できます。


1
Natty(Ubuntu 11.04)以降(packages.ubuntu.com/…を参照)
Martin Thoma

2
@pavonにpdfgrepは、-Rシンボリックリンクも追跡するなど、再帰オプションがあります
Tobias Kienzler '09 / 09/29

30

Recollは、PDFを含む数十の異なるフォーマットをサポートする、Unix / Linux向けの素晴らしい全文GUI検索アプリケーションです。クエリの正確なページ番号と検索語をドキュメントビューアに渡すこともできるため、GUIから直接結果にジャンプできます。

Recollには、実行可能なコマンドラインインターフェースとウェブブラウザインターフェースも付属しています


1
@Glutanimate 元の質問に関連する(複数のPDFを検索するためのコマンドラインツール)を追加できれば(私も、場合によっては他の人も)、ワイルドカード検索の実行方法と検索方法も知りたいと思いますすべてのサブディレクトリを含む、現在のディレクトリrecoll / xapianコマンドライン(非GUI)ではどのように見えますか?ありがとう!
nattyについてnattyについて

@LeszekŻarnaおそらくあなたがテストした例を投稿できますか?
nattyについて、

recoll マニュアルは ...いくつかのポインタが含まれているかもしれませんが、申し出ではなく、技術とは、「オフトピック」読み
ナッツをナッティについて

1
@nutty:recoll -t -q dir:pwdext:pdf 'neuro *'-stackoverflowがpwdの周りのバッククォートを食べました。
medoc 2016

13

実際のバージョンのpdfgrep(1.3.0)では、次のことが可能です。

pdfgrep -HiR 'pattern' /path

行うときpdfgrep --help

  • H:一致ごとにファイル名を出力します。
  • i:大文字小文字の区別を無視します。
  • R:ディレクトリを再帰的に検索します。

それは私のUbuntuでうまく動作します。


7

私はこの破壊的な小さなスクリプトを作りました。楽しんでください。

function pdfsearch()
{
    find . -iname '*.pdf' | while read filename
    do
        #echo -e "\033[34;1m// === PDF Document:\033[33;1m $filename\033[0m"
        pdftotext -q -enc ASCII7 "$filename" "$filename."; grep -s -H --color=always -i $1 "$filename."
        # remove it!  rm -f "$filename."
    done
}

2
+1。しかし、代わりに$filename.それをパイプする必要がありますgrep
Raphael Ahrens 2013

3

私は@sjrの答えが好きですが、xargsと-execの方が好きです。xargsの方が用途が広いと思います。たとえば、-Pを使用すると、意味のある複数のCPUを利用できます。

find . -name '*.pdf' | xargs -P 5 -I % pdftotext % - | grep --with-filename --label="{}" --color "pattern"

xargs'並列処理機能に関する興味深い点。あなたのことを注意--labelオプション引数がないであろう、文字通り {}ので、grepコマンドはもはやのコンテキストで実行されるfindexec
mklement0 2017年

2

同じ問題が発生したため、指定したフォルダー内のすべてのPDFファイルで文字列を検索し、クエリ文字列に一致するPDFファイルを印刷するスクリプトを作成しました。

多分これはあなたに役立つでしょう。

ここからダウンロードできます


スクリプトをコメントに含めると便利でしょうか?
baxx

私はあなたのスクリプトを試しましたが、pdfgrep解決策またはsjrのワンライナーよりもはるかに遅くなり、Ctrl-Cで終了した後でも、CPUスレッドの100%を使用して進行中のプロセスが残っていました。
Jason


2

ripgrep-allと呼ばれる別のユーティリティがあり、これはripgrepに基づいています

OfficeドキュメントやムービーなどのPDFドキュメントだけでなく、それよりも高速であると著者は主張していますpdfgrep

現在のディレクトリを再帰的に検索するためのコマンド構文、および2番目の構文はPDFファイルのみに制限します。

rga 'pattern' .
rga --type pdf 'pattern' .

1

PDFファイル内だけでなく、アーカイブにネストされたコンテンツ、データベーステーブル、画像メタデータ、POMファイルの依存関係、Webリソースなどのリソースや、再帰検索を含むこれらの組み合わせなど、他のリソースも含む、オープンソースの共通リソースgrepツールcrgrepがあります。

[ファイル]タブの下の完全な説明は、ツールがサポートするものをほぼカバーしています。

オープンソースツールとしてcrgrepを開発しました。


クレイグ-あなたはそのプロジェクトと関係がありますか?もしそうなら、あなたはあなたの答えでそれを述べるべきです。私がこれを言ったのは、他の2つの古い質問に対して事実上同じ答えを投稿したばかりだからです
Stephen C

私がcrgrepの作成者であることを明確にするために投稿を更新
Craig

1

まず、すべてのPDFファイルをテキストファイルに変換します。

for file in *.pdf;do pdftotext "$file"; done

その後grep、通常どおり使用します。これは、複数のクエリと多数のPDFファイルがある場合に高速であるため、特に優れています。


これは、ag github.com/ggreer/the_silver_searcherと組み合わせて実行した場合 。psychedeliks Gbでマイクロ秒単位で解析できます。生涯のフラットファイル
NVRM

0

PDFをテキストファイルに変換してからテキスト内を検索するには、pdf2textなどのツールが必要です。(おそらくいくつかの情報や記号を見逃すでしょう)。

プログラミング言語を使用している場合、おそらくこの目的のために作成されたPDFライブラリがあります。例 Perlの場合はhttp://search.cpan.org/dist/CAM-PDF/


0

上記のような簡単なスクリプトで「acroread」を使用してみてください

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