我正在使用 Opensuse 10.3,想知道命令行工具如何在目录内的大量 pdf 文件中搜索短语。在 Windows XP 中,Explorer 搜索允许这样做,但速度太慢了。这里有 grep 提示吗?
答案1
SEARCH_DIR="/some/dir/where/you/want/to/search/"; SEARCH_STRING="无论您在搜索什么";
# 从 pdf 中提取文本 pdftotext “文件.pdf” “文件.txt” # 使用 grep 连接 pdftotext “文件.pdf” /dev/stdout |grep -H --label="文件.pdf" -- “$SEARCH_STRING” # 如果你希望 grep 仅显示匹配的 pdf 文件的文件列表,请添加 --files-with-matches pdftotext “file.pdf” /dev/stdout |grep -H --label="file.pdf" --files-with-matches -- “$SEARCH_STRING” # 找到可以搜索的 pdf 列表 查找“$SEARCH_DIR”-type f-name'*.pdf'>list-of-pdf.txt
# 所有内容都由 awk 像胶带一样连接起来,然后发送给 bash 进行处理 # 双引号在 awk 中被转义为 x22。 查找“$SEARCH_DIR”-type f -name'*.pdf'|awk -v SEARCH_STRING="$SEARCH_STRING"'{ 打印“pdftotext \x22“$0”\x22 /dev/stdout | grep -H --label=\x22“$0”\x22 -- \x22“SEARCH_STRING”\x22” }' |bash
# 无需 bash。进一步处理以满足您的需求 查找“$SEARCH_DIR”-type f -name'*.pdf'|awk -v SEARCH_STRING="$SEARCH_STRING"' { EXEC="pdftotext \x22"$0"\x22 /dev/stdout | grep -H --label=\x22"$0"\x22 -- \x22"SEARCH_STRING"\x22"; while(EXEC|getline ret){ 打印“对于文件[“$0”]我们有匹配[“ret”]”; # 做任何你喜欢的事。 }; 关闭(EXEC); }'
答案2
在 Linux 和 Windows 下,您都可以使用 Acrobat Reader,它有一个搜索多个文件的命令。
在 Linux 下,有 Recoll,它会在第一次运行时为您的 pdf 文件(以及更多文件)建立索引。索引建立后,单词搜索应该非常快;短语搜索应该合理。在pdftotext
启动 Recoll 之前,请确保已安装该命令;在 Debian 和 Ubuntu 下,它在软件包中poppler-utils
,我不知道 Suse 的情况。
或者您可以直接将文件转换为文本,然后使用以下命令对文本文件使用 grep。
查找 -name '*.pdf' -exec pdftotext {} \; grep -r --include '*.txt' -l -F “要搜索的精确短语” grep -r --include '*.txt' -l -E “要搜索的正则表达式”
答案3
Adobe Reader X 可以胜任这项工作,而且做允许在整个目录和子目录下进行搜索,而不仅仅是在文件内部进行搜索,但它不是命令行程序。
答案4
我发现的最简单的方法
结合以上所有答案,这是最简单的方法我发现:
find . -iname "*.pdf" -exec pdftotext {} - \; | grep -i "what you search"
解释:
pdftotext
似乎不接受多个文件。我们用 find 来解决这个问题,并为pdftotext
每个文件创建一个。- 将输出文件名设置为
-
将pdftotext
输出发送到标准输出,因此 a) 我们可以获得所有连续的 PDF 文本,b) 我们可以通过管道传输到 grep。
如果你没有,pdftotext
请执行以下操作在类似 debian/ubuntu 的发行版中安装它:
apt-get install xpdf