搜索多个PDF文件的内容
1. 简介
在一堆 PDF 文件中搜索给定字符串的出现是我们发现自己经常做的事情。它可能用于个人实用程序,例如查找即将到来的旅程的火车票或我们必须从 PDF 文件中提取一些数据的商业实用程序。虽然我们可以使用 GUI 查看器手动打开每个 PDF 文件并搜索字符串,但当文件集很大时,这个过程会变得非常麻烦。
使用命令行工具,我们可以轻松地自动搜索大量文件。但是,我们必须注意,PDF 是一种二进制格式,*诸如grep *和 sed 之类的纯文本搜索命令在 PDF 文件上将无法正常工作。
在本教程中,我们将介绍一些可用于在 PDF 文件中搜索字符串的专用命令。
2. 使用pdftotext
**pdftotext 命令是将 PDF 文件转换为纯文本的实用程序。**默认情况下,大多数 Linux 发行版都提供了它。我们可以使用此命令将所有 PDF 文件转换为纯文本,然后在生成的纯文本输出上运行*grep 。*这是一个多步骤的过程。因此,我们将逐个查看每个步骤,然后将所有步骤组合成一个命令。
2.1. 将 PDF 文件转换为纯文本
我们可以将单个 PDF 文件转换为纯文本,如下所示:
$ pdftotext filename.pdf -
最后的连字符用于指示命令将输出发送到标准输出。否则,它将输出保存在文本文件中。我们需要将输出输入标准输出,以便我们可以将其通过管道传输到其他命令以进行进一步处理。
2.2. 在 PDF 文件中搜索
我们可以将上述命令的纯文本输出通过管道传输到 grep命令中,以在文件中搜索字符串或模式:
$ pdftotext train-ticket.pdf - | grep --with-filename --label=train-ticket.pdf -i "bengaluru"
train-ticket.pdf:From: KSR BENGALURU(SBC)
train-ticket.pdf:Boarding At: KSR BENGALURU(SBC)
我们添加了*–with-filename和 –label标志来打印每个匹配的文件名。-i*标志用于使用提供的 模式执行不区分大小写的搜索。我们可以省略它来执行区分大小写的搜索。
2.3. 查找文件夹中的所有 PDF 文件
现在我们有了搜索单个文件的命令,我们必须使用find 命令遍历所有 PDF 文件。首先,我们将简单地运行 find命令来打印当前文件夹中的所有 PDF 文件路径:
$ find . -name '*.pdf'
./sbc-2022-01-02.pdf
./train-ticket.pdf
./downloads/HR_23-01-2022.pdf
./downloads/subfolder/20-01-2022 HMB English.pdf
./30-01-2022 HMB English.pdf
命令中的点表示当前文件夹,我们可以将其替换为任何其他搜索路径。*.pdf作为名称参数过滤具有 .pdf扩展名的文件名。
2.4. 结合步骤
现在我们可以使用find 命令的exec参数对 每个文件执行搜索并按文件打印结果:
$ find . -name '*.pdf' -exec sh -c 'pdftotext "{}" - | grep --with-filename --label="{}" -i bengaluru' \;
./sbc-2022-01-02.pdf:Resv. Upto: KSR BENGALURU(SBC)
./sbc-2022-01-02.pdf:To: KSR BENGALURU(SBC)
./train-ticket.pdf:From: KSR BENGALURU(SBC)
./train-ticket.pdf:Boarding At: KSR BENGALURU(SBC)
./downloads/subfolder/20-01-2022 HMB English.pdf:Bengaluru Urban
我们看到 find命令对当前文件夹以及子文件夹中的 PDF 文件进行递归搜索。我们可以添加maxdepth参数以仅搜索文件夹或仅包含指定级别的子文件夹:
$ find . -maxdepth 1 -name '*.pdf' -exec sh -c 'pdftotext "{}" - | grep --with-filename --label="{}" -i bengaluru' \;
3.使用 pdfgrep
pdfgrep 命令可用于在单个步骤中搜索 PDF 文件中的模式 。但是,默认情况下它可能在我们的 Linux 发行版上不可用,我们需要安装pdfgrep包才能使用它。一旦我们完成了所有设置,使用它就非常容易:
$ pdfgrep -HiR bengaluru .
./sbc-2022-01-02.pdf: From: MYSURU JN(MYS) Date Of Journey: 02-Jan-2022 To: KSR BENGALURU(SBC)
./sbc-2022-01-02.pdf: Resv. Upto: KSR BENGALURU(SBC) Scheduled Arrival: 02-Jan-2022 21:05 * Adult: 2 Child: 0
./train-ticket.pdf: From: KSR BENGALURU(SBC) Date Of Journey: 01-Jan-2022 To: MYSURU JN(MYS)
./train-ticket.pdf: Boarding At: KSR BENGALURU(SBC) Date Of Boarding: 01-Jan-2022 Scheduled Departure: 01-Jan-2022 10:50 *
我们使用H选项打印文件名,使用 i选项进行不区分大小写的搜索,使用R选项递归搜索指定文件夹的所有子文件夹(在本例中为当前文件夹)。正如我们在上面看到的,转换的输出可能会因为大空间而有点混乱。
4. 使用 ripgrep-all
我们可以使用 实用程序ripgrep-all 中的rga命令 来查找 PDF 文件以及其他文件格式中的模式。虽然安装包有点麻烦,但是使用命令很简单:
$ rga --type pdf bengaluru
sbc-2022-01-02.pdf
Page 1: Resv. Upto: KSR BENGALURU(SBC)
Page 1: To: KSR BENGALURU(SBC)
train-ticket.pdf
Page 1: From: KSR BENGALURU(SBC)
Page 1: Boarding At: KSR BENGALURU(SBC)
该命令打印所有匹配项以及文件名以及模式出现的页码。