有没有办法在位于特定驱动器上的多个 pdf 文件中搜索(grep/find)特定单词?

DiF*_*rag 3 grep find search pdf pdfgrep

我正在尝试找到保存在外部备份驱动器上的客户的 pdf 文件,其中包含超过 8000 个 pdf 文件和数百个文件夹。

例如,如果我想搜索驱动器 X: 上包含我的客户名称“Sequoia Group”的所有 pdf 文件,有哪些有用的命令行和/或工具来实现相关的输出结果?

我使用的是 MacOS High Sierra,带有 zsh,我还通过自制程序安装了 GNU grep、ack 和 pdfgrep。但是,我还没有找到该文件。

文件名未知,因为所有文件都保存为 PDF-Backup-0001、PDF-Backup-0002...等,

到目前为止,我使用了以下命令,但没有成功:

#grep -wirl "sequoia group" ./

#pdfgrep -iHncRZ "sequoia group"

#mdfind "sequoia group"
Run Code Online (Sandbox Code Playgroud)

另外,建议使用此命令行,但是,我不确定在哪里放置名称,因此我将 /path 替换为驱动器的路径,并将模式替换为“sequoia”,仍然没有找到任何匹配项

#find /path -iname '*.pdf' -exec pdfgrep pattern {} + 
#find /Volumes/X Backup -iname '*.pdf' -exec pdfgrep "sequoia" {} + 
Run Code Online (Sandbox Code Playgroud)

bu5*_*man 5

啊,这怎么这么熟悉啊……

在搜索目录的根目录中打开一个终端,然后

pdfgrep -ril  "sequoia group" >matches 2>bad.files
Run Code Online (Sandbox Code Playgroud)

这将递归地-r搜索所有 pdf 文件中的搜索词,不区分大小写-i,并且仅返回文件名而不返回匹配的文本-l

所有匹配的文件名都将写入名为的文件中matches,任何错误都将写入名为的文件中bad.files

您可以将其matches复制到单独的目录以供参考。

while read f do; cp $f /wherever/I/want/$f; done < matches
Run Code Online (Sandbox Code Playgroud)

bad.files要么已损坏,要么 OCR 不正确,因此您应该将它们复制到另一个目录,重新处理它们并再次搜索它们。

如果您急于使用,find因为您可能有等的变体pdfPDF那么

find /search/root/ -iname *.pdf -exec pdfgrep -il "sequoia group" {} ';' >matches 2>bad.files
Run Code Online (Sandbox Code Playgroud)

您在上面要求对此进行解释...find我认为您得到的命令pdfgrep在上面进行了解释,重定向也是如此>

选项-exec获取命令find的输出find并将其放在您看到的位置{}

最后-exec你会看到我已经放了,;而你已经放了+

+导致-exec收集所有输出find并将其pdfgrep作为一长串参数传递给并运行 pdfgrep 一次。除非文件数量超过最大数量,否则工作正常。

;导致一次将 的-exec输出提供find给一个文件。pdfgrep

后记。打开一些 pdf 文件,无论您用什么方式查看它们,并确保它们已经过 OCR 并且实际上是可搜索的。

如果不是,您可能需要从每个目录运行它

find /path/to/dir/ -maxdepth 1 -type f -iname "*.pdf" -print0 | while IFS= read -r -d $'\0' line; do pdfsandwich -lang eng "$line"; done
Run Code Online (Sandbox Code Playgroud)

如果您可以让您的电脑专门处理所有 8,000 个文件,无论需要多长时间,那么只需删除-maxdepth 1find指向您的搜索根目录即可。