我发现的最简单的方法

我发现的最简单的方法

我正在使用 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"

解释:

  1. pdftotext似乎不接受多个文件。我们用 find 来解决这个问题,并为pdftotext每个文件创建一个。
  2. 将输出文件名设置为-pdftotext输出发送到标准输出,因此 a) 我们可以获得所有连续的 PDF 文本,b) 我们可以通过管道传输到 grep。

如果你没有,pdftotext请执行以下操作在类似 debian/ubuntu 的发行版中安装它:

apt-get install xpdf

相关内容