【问题标题】:How do I write a batch process command using gnu parallel?如何使用 gnu 并行编写批处理命令?
【发布时间】:2021-12-03 05:03:52
【问题描述】:

我正在尝试使用名为 ocrmypdf 的包进行一些批处理。

这是一个可以处理1个pdf文件的命令

ocrmypdf input.pdf output.pdf

这是一个可以处理我们运行目录中所有pdf文件的命令。

parallel --tag -j 2 ocrmypdf '{}' 'output/{}' ::: *.pdf

现在,我实际上想对目录中的所有 pdf 文件运行此命令。这个多了一个参数。

ocrmypdf --sidecar txt/input.txt input.pdf out/output.pdf

我之前尝试过这样重写并行命令:

parallel --tag -j 2 ocrmypdf --sidecar txt/{}.txt {}.pdf out/{}.pdf ::: *.pdf

但我得到了错误:

ocrmypdf: error: the following arguments are required: output_pdf

有人可以帮我理解我做错了什么吗?谢谢!

【问题讨论】:

  • 这可能会有所帮助:stackoverflow.com/tags/gnu-parallel/info
  • 也许尝试引用整个命令(在-j 2::: 之前开始的部分),正如赛勒斯所指的,手册中有一节关于引用。另外,也许尝试明确添加选项--output(或者正确的拼写是ocrmypdf)?您还可以使用并行选项--joblog logfile,这可能会为您节省一些线索信息以帮助您进行故障排除...!
  • 哦,我认为您也应该摆脱 {}.pdf 额外的 .pdf 文件。因为那会给出.pdf.pdf。将--dryrun 添加到您的并行命令中,它将准确打印它将运行哪些命令,而无需实际运行它们。因此,也许您的工具以一种模棱两可的方式抱怨,因为它找不到任何 *.pdf.pdf 输入文件,并且搞砸了输出文件参数的继续解析
  • @SkV 我相信我在更新答案中的“潜在解决方案”应该适合您!仅供参考

标签: python-3.x bash parallel-processing gnu-parallel ocrmypdf


【解决方案1】:

试试:

parallel --tag -j 2 ocrmypdf --sidecar txt/{.}.txt {} out/{} ::: *.pdf

大括号后面的 .pdf(即“{}.pdf”)是无关的,将导致无法找到输入文件(“{}”默认情况下也会捕获扩展名),并且对于文本一,通过在括号内添加句点,自动删除扩展名,因此您最终将得到“....txt”而不是“....pdf.txt”文件(其中“... " = 与输入匹配的相同文件名)

如果上述方法不起作用,可能是由于文件名中包含空格,或者其他一些字符混淆了并行解析(如文件名中的引号字符、括号等),请尝试使用文件作为输入:

故障排除解决方案 - 创建一个文件作为 parallel 的输入

我相信这应该可行。为了避免引号引起的大惊小怪,我首先创建了一个包含所有 pdf 名称的文件(来自 cwd 的完整相对路径):

[g]ls --color=none *.pdf | parallel -q printf '%s'\\n {} > ocrmypdf.list

[g]ls --color=none -N *.pdf > ocrmypdf.list

重要的是,.list 文件中的打印文件名中没有引入单引号——引号应该是“文字”,例如:

像这样:

Tritone Substitution sheet music.pdf

不是这样的:

'Tritone Substitution sheet music.pdf'

然后你可以运行并行 ocrmypdf 命令,如下所示:

parallel -j 2 ocrmypdf --sidecar txt/{.} {} out/{} :::: ocrmypdf.list

还要注意 4 :::: 与通常的三个,因为它是从文件中读取的。这将默认为每行并行运行一个完整的文件名参数,因此,不用担心输入文件的 pdf 文件名中是否有空格等。

【讨论】:

  • 是否存在ls --color=none *.pdf | parallel -q printf '%s'\\n {} > ocrmypdf.listls --color=none *.pdf > ocrmypdf.list不一样的情况?
  • @OleTange 我在测试我的答案是否有效时观察到的问题是文件名中包含空格字符
  • 但是,对我来说,是有区别的。如果不通过并行管道将其传递给 printf,我会得到一堆围绕文件名的前导单引号(if 它们有任何空格)。如果我没记错的话,运行主并行 ocrmypdf 命令会搞砸,因此我必须将文件的创建变成更复杂的代码行! @OleTange
  • 例如,在我的 ~/Downloads 文件夹中运行 ls --color=none *.pdf整理多年来在那里收集的东西) - 我会在我的答案中更新这个
  • 你有一些东西导致ls 不能运行ls --quoting-style=literal */*' '*pdf。这可能是别名或 QUOTING_STYLE 环境变量。我只在 stdout 没有被重定向时才看到这个(换句话说:ls | cat 不会做引用)。
【解决方案2】:

这对我有用:

parallel --tag -j 2 ocrmypdf --sidecar txt/{.}.txt {} out/{} ::: *.pdf

如果它不适合你:

  • 识别失败的文件
  • 手动运行失败的文件以检查它是否有效
  • 编辑您的问题以包含指向失败文件的链接

(在运行多个 tesseracts 时也要注意这个错误:https://github.com/tesseract-ocr/tesseract/issues/3109#issuecomment-703845274

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-09
    • 1970-01-01
    • 1970-01-01
    • 2021-08-13
    • 1970-01-01
    相关资源
    最近更新 更多