命令行工具可搜索大量pdf文件中的短语


9

我正在使用Opensuse 10.3,并且想知道命令行工具来搜索目录中大量pdf文件中的短语。在Windows XP中,资源管理器搜索允许这样做,但速度太慢。这里有grep提示吗?



我想先了解命令行工具,如果有GUI工具,那么它也会很好..Wingrep仅在Windows下。而且我只想搜索pdf文件,因此针对该文件进行了优化的应用程序很不错
iceman 2010年

Answers:


6
SEARCH_DIR =“ / some / dir / where / you / want / to / search /”;
SEARCH_STRING =“正在搜索的内容”;
#从pdf提取文本
pdftotext“ file.pdf”“ file.txt”

#用grep连接
pdftotext“ file.pdf” / dev / stdout | grep -H --label =“ file.pdf”-“ $ SEARCH_STRING”

#如果您希望grep仅显示匹配的pdf文件的文件列表,请添加--files-with-matches
pdftotext“ file.pdf” / dev / stdout | grep -H --label =“ file.pdf”-具有匹配项的文件-“ $ SEARCH_STRING”

#查找可能要搜索的pdf列表
查找“ $ SEARCH_DIR”-类型f-名称'* .pdf'> list-of-pdf.txt
#一切由awk连接在一起的胶带,送至bash进行处理
#双引号在awk中转义为x22。
查找“ $ SEARCH_DIR”-类型f-名称'* .pdf'| awk -v SEARCH_STRING =“ $ SEARCH_STRING”'{
打印“ pdftotext \ x22” $ 0“ \ x22 / dev / stdout | grep -H --label = \ x22” $ 0“ \ x22-\ x22” SEARCH_STRING“ \ x22”
}'| bash

#没有重击。满足您需求的进一步流程
查找“ $ SEARCH_DIR”-类型f-名称'* .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);
}'

我想您没有注意到问题中提到“ Windows XP”windows-search标签的部分。我知道这个问题(困惑地)是从“ openSUSE”开始的,但是Windows引用比Linux引用要多。特别是当您计算他随后的评论时
Synetech

@Synetech:他拒绝了“ Wingrep仅在Windows下”的答案,这表明他想要Linux解决方案。
机械蜗牛

@Mechanicalsnail,他拒绝了它,因为它是一个GUI工具,要求提供命令行工具。
Synetech

3

在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“要搜索的正则表达式”

adobe不允许在整个目录下搜索,而只能在文件内进行搜索。我想先了解命令行工具,如果有GUI工具,那么它也会很好
iceman 2010年

Linux下的Adobe Reader 9具有“编辑|搜索”菜单项,该菜单项允许您搜索目录中的所有PDF文件。在命令行上,我知道的所有方法都涉及一个步骤pdftotext(诸如Recoll之类的工具会自动执行)。
吉尔(Gilles)'所以

1
+1为Recoll。如果您有很多文件并且经常搜索它们,则对文件建立索引将节省时间。
机械蜗牛

1

Adobe Reader X可以完成这项工作,它确实允许在整个目录和子目录下进行搜索,不仅可以在文件内进行搜索,而且它不是命令行程序。


是最新版本的Acrobat X吗?哪个版本?
iceman 2012年

我尝试了Acrobat索引工具,称它为原始是一种赞美。recoll手动安装在debian上,现在尝试使其可用于基于Windows的员工。
克里斯K

0

要递归列出主目录中所有具有PDF文件扩展名且包含与regex' [iI]n Haskell' 相匹配的行的文件,可以发出:

find ~/ -regextype posix-extended -regex '.*\.pdf' -execdir sh -c 'pdftotext "$0" - | grep -El --label="$PWD${0#?}" "$1"' {} '[iI]n Haskell' \;

备注:

  • 虽然它不是在这个例子中尤为必要,我已经构造这个避免使用-execxargs因为,出于安全原因,我认为这是很好的做法,进入这样的习惯。在这种情况下,将“ -execdir” 更改为“ -exec”和将“ ” 更改$PWD${0#?}为“ $0”应达到相同的结果。
  • 代替使用glob来对文件名进行模式匹配,使用正则表达式的更大表达能力并在整个路径上进行模式匹配可能会很有用。我在此处包括了实践,以说明如何实现。请注意,与模式匹配的路径是通常会打印的路径。它是相对的还是绝对的取决于给定的路径参数,如果发出该参数,则默认为当前工作目录(' ./')。在此示例中,匹配的路径都是绝对路径(即以“ /' 开头”),因为“ ~/”被扩展为当前用户主目录的绝对路径,并且它是唯一的路径参数。
  • $0”和“ $1”是位置参数,以正确引用参数的方式使用。如果执行不正确,则该命令容易受到任意文件名的攻击。
  • ' ${0#?}'去除的第一个字符$0,即' .'。

要打印每个匹配的行,并以文件名开头:

find ~/ -regextype posix-extended -regex '.*\.pdf' -execdir bash -c 'pdftotext "$0" - | grep -EH --label="${0:2}" "$1"' {} '[iI]n Haskell' \;

此变体使用“ -H”代替“ -l”,并使用文件名而不是文件路径标记。'去${0:2}除了的前两个字符$0,即' ./',但是显然不能被识别sh

当然,请调整您的需求。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.