【问题标题】:how to couple xargs with pdftotext converter to search inside multiple pdf files如何将 xargs 与 pdftotext 转换器耦合以在多个 pdf 文件中进行搜索
【发布时间】:2015-03-24 12:05:02
【问题描述】:

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

【问题讨论】:

    标签: linux unix scripting xargs pdftotext


    【解决方案1】:
    find . -name '*.pdf' -print0 | xargs -0 -n1 -I '{}' pdftotext '{}' -
    

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

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

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

    【讨论】:

    • 我遇到错误 SHELL PROMPT>find ~/.personal/tips/pdf -name '*.pdf' -print0 | xargs -0 -n1 -I{} pdftotext {} - xargs: {}: 没有这样的文件或目录
    • 可能值得引用{},以防阅读此答案的任何人使用zsh。 (这就是为什么我坚持使用 xargs 手册页中建议的 % 的原因;我自己不使用 zsh,但没有理由使用主要 shell 为其他人创建故障模式)。
    • 顺便说一句,虽然find 的输出可以准确地表示除换行符以外的所有文件名而不使用-print0,但xargs 用于读取内容的默认行为在没有@987654335 的情况下并不那么健壮@;它尝试解释引号、解析空格等;它不是换行符与空值交换的直接等价物。如果使用 xargs 读取换行符分隔的文件名,则使用 GNU xargs 扩展 -d $'\n' 是明智的,因为这会禁用其他行为。
    • @Charles Duffy 很高兴知道。我一直坚持使用-print0(查找)+-0(主要是xargs),试图避开UNIX命令行处理的那些黑暗角落。
    【解决方案2】:

    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 命令行中适当地使用该%

    【讨论】:

      猜你喜欢
      • 2016-03-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-06
      • 2011-01-31
      • 1970-01-01
      • 2022-11-28
      相关资源
      最近更新 更多