如何搜索多个pdf文件的内容?

Jes*_*Joy 208 linux pdf debian grep full-text-search

我怎样才能在目录/子目录中搜索PDF文件的内容?我正在寻找一些命令行工具.似乎grep无法搜索PDF文件.

小智 199

pdfgrep,它正如它的名字所暗示的那样.

pdfgrep -R 'a pattern to search recursively from path' /some/path
Run Code Online (Sandbox Code Playgroud)

我用它进行简单搜索,效果很好.

(Debian,Ubuntu和Fedora都有软件包.)

从版本1.3.0开始,pdfgrep支持递归搜索.自Ubuntu 12.10(Quantal)以来,这个版本在Ubuntu中可用.

  • @pavon`pdfgrep`现在有了这个递归选项,包括`-R`也跟着符号链接 (2认同)

sjr*_*sjr 197

您的发行版应该提供一个名为pdftotext:

find /path -name '*.pdf' -exec sh -c 'pdftotext "{}" - | grep --with-filename --label="{}" --color "your pattern"' \;
Run Code Online (Sandbox Code Playgroud)

" - "是将pdftotext输出到stdout而不是文件的必要条件.在--with-filename--label=选项将在grep的输出把文件名.可选--color标志很好,告诉grep使用终端上的颜色输出.

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

这种方法,使用pdftotextgrep,拥有一个优势pdfgrep,如果你想使用GNU的特点greppdfgrep不支持.注意:pdfgrep-1.3.x支持-C打印上下文行的选项.

  • 这有效,但不会显示匹配的文件名.任何的想法? (4认同)
  • @sjr只是为了记录:我使用的是Ubuntu 12.10并且`pdfgrep`是无用的,它报告了大量无法处理的文件垃圾.另一方面,你的解决方案也有帮助.所以请不要删除它,即使3年后仍然有用! (2认同)

Glu*_*ate 28

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

Recoll还带有可行的命令行界面和Web浏览器界面.

  • @Glutanimate 如果您可以添加与原始问题相关的**示例**(用于搜索多个 pdf 的命令行工具),它会有所帮助(我和其他人也可能):* 我还想看看如何执行**通配符搜索**以及如何搜索**当前目录,包括所有子目录**。在命令行(非 GUI)中使用 `recoll / xapian` 会怎样?谢谢! (2认同)

ark*_*khi 12

我的pdfgrep(1.3.0)的实际版本允许以下内容:

pdfgrep -HiR 'pattern' /path
Run Code Online (Sandbox Code Playgroud)

做的时候pdfgrep --help:

  • H:打印每个匹配的文件名.
  • 我:忽略案件区别.
  • R:递归搜索目录.

它在我的Ubuntu上运行良好.


osc*_*ury 11

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

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

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

rga 'pattern' .
rga --type pdf 'pattern' .
Run Code Online (Sandbox Code Playgroud)


小智 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
}
Run Code Online (Sandbox Code Playgroud)

  • +1.但不是`$ filename.你应该把它管道输入`grep`. (2认同)