如何将xargs与pdftotext转换器耦合以搜索多个pdf文件

时间:2015-03-24 12:05:02

标签: linux unix scripting xargs pdftotext

我正在编写一个脚本,该脚本应该在目录中的所有pdf文件中进行搜索。我找到了一个名为" pdftotext"这使我能够在pef文件上使用grep,但我只能用一个文件运行它。当我想在目录中存在的所有文件上运行它然后它失败。有什么建议 ?

这适用于:单个文件

pdftotext my_file.pdf - | grep 'hot'

此操作失败:搜索pdf文件并转换为文本和greping

SHELL PROMPT>find ~/.personal/tips -type f -iname "*" | grep -i "*.pdf" | xargs pdftotext |grep admin
pdftotext version 3.00
Copyright 1996-2004 Glyph & Cog, LLC
Usage: pdftotext [options] <PDF-file> [<text-file>]
  -f <int>          : first page to convert
  -l <int>          : last page to convert
  -layout           : maintain original physical layout
  -raw              : keep strings in content stream order
  -htmlmeta         : generate a simple HTML file, including the meta information
  -enc <string>     : output text encoding name
  -eol <string>     : output end-of-line convention (unix, dos, or mac)
  -nopgbrk          : don't insert page breaks between pages
  -opw <string>     : owner password (for encrypted files)
  -upw <string>     : user password (for encrypted files)
  -q                : don't print any messages or errors
  -cfg <string>     : configuration file to use in place of .xpdfrc
  -v                : print copyright and version info
  -h                : print usage information
  -help             : print usage information
  --help            : print usage information
  -?                : print usage information
SHELL PROMPT 139>

2 个答案:

答案 0 :(得分:2)

find . -name '*.pdf' -print0 | xargs -0 -n1 -I '{}' pdftotext '{}' -

默认情况下,xargs会尝试在pdftotext的命令行中插入尽可能多的行。你不希望这样。 你想要的是每次调用一个文件后跟' - '。这可以通过-n1(每次调用限制为一个参数)和-I '{}'(make {}作为参数适合的占位符来实现。)

找到的-print0选项与xargs的-0选项相结合,使得'\ 0'(空字节)而不是换行符('\ n')作为参数分隔符。

使用-n1-I{}这样的Xargs在语义上与Charles Duffy推荐的find -exec完全相同。 Xargs的优势在于可以使用多核处理器(它可以一次运行多个pdftotext实例;您可以使用-P开关配置多少个。)

答案 1 :(得分:1)

xargs是这项工作的错误工具:find可以完成内置所需的一切。

find ~/.personal/tips \
    -type f \
    -iname "*.pdf" \
    -exec pdftotext '{}' - ';' \
  | grep hot

也就是说,如果 由于某种原因想要使用xargs,那么正确的用法看起来就像......

find ~/.personal/tips \
    -type f \
    -iname "*.pdf" \
    -print0 \
  | xargs -0 -J % -n 1 pdftotext % - \
  | grep hot

请注意:

  • find命令使用-print0 NUL分隔其输出
  • xargs命令使用-0来NUL分隔其输入(这也会导致某些行为导致文件名的错误处理,其名称中包含空格,文字引号等)。
  • xargs命令使用-n 1为每个文件调用pdftotext
  • xargs命令使用-J %指定替换应该发生的位置,并在pdftotext命令行中正确使用%