3

我正在制作一个脚本,它应该在目录中的所有 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>
4

2 回答 2

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

默认情况下,xargs 将尝试在 pdftotext 的命令行上容纳尽可能多的行。你不想要那个。您想要的是每次调用一个文件,后跟“-”。这可以通过-n1(每次调用限制为一个参数)和-I '{}'(使 {} 成为参数适合的位置的占位符)来实现。

find的-print0选项加上-0xargs 的选项使得两者都使用 '\0'(空字节)而不是换行符('\n')作为参数分隔符。

Xargs with -n1and -I{}used like this 在语义上几乎等同于find -execCharles Duffy 推荐的。Xargs 具有可以利用多核处理器的优势(它可以一次运行多个 pdftotext 实例;您可以使用-P开关配置多少个)。

于 2015-03-24T12:08:20.647 回答
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 命令行中适当地使用它。
于 2015-03-24T12:07:20.303 回答