关于linux:如何搜索多个pdf文件的内容?

How to search contents of multiple pdf files?

如何在目录/子目录中搜索PDF文件的内容? 我正在寻找一些命令行工具。 似乎grep无法搜索PDF文件。


有pdfgrep,它的功能恰如其名。

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

我已经将其用于简单搜索,并且效果很好。

(在Debian,Ubuntu和Fedora中有软件包。)

从1.3.0版开始,pdfgrep支持递归搜索。自Ubuntu 12.10(Quantal)起,此版本已在Ubuntu中可用。


您的发行版应提供一个名为pdftotext的实用程序:

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

要使pdftotext输出到stdout,而不是文件,必须使用"-"。
--with-filename--label=选项会将文件名放在grep的输出中。
可选的--color标志很不错,它告诉grep使用终端上的颜色进行输出。

(在Ubuntu中,pdftotext由软件包xpdf-utilspoppler-utils提供。)

如果要使用pdfgrep不支持的GNU grep功能,则使用pdftotextgrep的方法比pdfgrep有优势。注意:pdfgrep-1.3.x支持-C选项来打印上下文行。


Recoll是用于Unix / Linux的出色的全文本GUI搜索应用程序,它支持包括PDF在内的多种不同格式。它甚至可以将查询的确切页码和搜索词传递给文档查看器,从而使您可以直接从其GUI跳转到结果。

Recoll还具有可行的命令行界面和Web浏览器界面。


我的pdfgrep(1.3.0)的实际版本允许以下操作:

1
pdfgrep -HiR 'pattern' /path

在执行pdfgrep --help时:

  • H:打印每个匹配项的文件名。
  • i:忽略大小写区别。
  • R:递归搜索目录。

它在我的Ubuntu上运行良好。


我做了这个破坏性的小脚本。玩得开心。

1
2
3
4
5
6
7
8
9
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
}


我喜欢@sjr的答案,但是我更喜欢xargs与-exec。我发现xargs更通用。例如,使用-P时,我们可以利用多个CPU。

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


如果要使用pdftotext查看文件名,请使用以下命令:

1
find . -name '*.pdf' -exec echo {} \; -exec pdftotext {} - \; | grep"pattern\|pdf"

我遇到了同样的问题,因此编写了一个脚本,该脚本在指定文件夹中的所有pdf文件中搜索字符串,然后打印与查询字符串匹配的PDF文件。

也许这对您有帮助。

你可以在这里下载


首先将您所有的pdf文件转换为文本文件:

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

然后正常使用grep。这特别好,因为当您有多个查询和许多PDF文件时,它很快。


有一个开放源代码的公共资源grep工具crgrep,它可以在PDF文件中进行搜索,还可以在其他资源中进行搜索,例如嵌套在档案中的内容,数据库表,图像元数据,POM文件依赖项和Web资源-以及它们的组合,包括递归搜索。

文件选项卡下的完整描述几乎涵盖了该工具支持的内容。

我将crgrep开发为开源工具。


还有另一个名为ripgrep-all的实用程序,它基于ripgrep。

它不仅可以处理PDF文档(例如Office文档和电影),而且作者声称它比pdfgrep更快。

用于递归搜索当前目录的命令语法,第二个语法仅限于PDF文件:

1
2
rga 'pattern' .
rga --type pdf 'pattern' .


尝试在上述简单脚本中使用" acroread"


您需要诸如pdf2text之类的工具,才能将pdf转换为文本文件,然后在文本内部进行搜索。 (您可能会错过一些信息或符号)。

如果您使用的是编程语言,则可能为此目的编写了pdf库。例如http://search.cpan.org/dist/CAM-PDF/ for Perl