【发布时间】:2017-07-25 11:50:00
【问题描述】:
是否可以使用gnu parallel 的一个实例同时具有两种输入文件类型?
这个长命令:
find . -name \*.pdf | parallel -j 4 --progress --eta 'mkdir -p {.} && gs -dQUIET -dINTERPOLATE -dSAFER -dBATCH -dNOPAUSE -dPDFSETTINGS=/ebook -dNumRenderingThreads=4 -sDEVICE=pgmraw -r300 -dTextAlphaBits=4 -sProcessColorModel=DeviceGray -sColorConversionStrategy=Gray -dOverrideICC -o {.}/{.}-%03d.pgm {}' && time find . -name \*.pgm | parallel -j 4 --progress --eta 'tesseract {} {.} -l deu_frak && rm {.}.pgm'
一)
- 为它读取的每个 pdf 创建一个文件夹(第一个输入文件类型)
- 将带有
Ghostscript的pdf 转换为pgm 图像 - 将它们移动到相应的文件夹中
- 然后它将使用 tesseract 对每个 pgm(第二个输入文件类型)执行 OCR
- 之后它将文本文件保存在各个文件夹中
- 最后,删除所有 pgm 图像文件。
然而,上面的命令实际上是由两个命令结合&&组成的,把上面的例程分成两个独立的部分。结果是:
b)
- 首先将所有 pdf 文件转换为 pgm 图像文件(这会占用大量磁盘 空间!)
- 在它以 ocr 开头并随后清除 then 不需要的 pgm 图像文件。
这是不受欢迎的,因为它会在命令的第二部分执行之前耗尽我所有的磁盘空间!
可以将两个命令合并为一个,以便parallel 将完成前四个 pdf 的 a) 的整个过程(因为 parallel 同时执行 4 个作业 -j 4),之前转到接下来的四个 pdf 文件?
但是,parallel 似乎无法实现以下最小示例:
parallel -j 4 --progress --eta 'mkdir -p {.} && gs -sDEVICE=pgmraw -r300 -o {.}/{.}-%03d.pgm {}' && tesseract {} {.} -l deu_frak && rm {.}.pgm’ ::: *.pdf *.pgm
注意,最后两个输入文件扩展名::: *.pdf *.pgm。
我该怎么做才能让parallel 遵循常规a)?
编辑:
这是我按照 Ole Tange 的建议尝试过的全部代码:
generate_pgm() {
PDF="$1"
find . -name \*.pdf | parallel 'mkdir -p {.} && gs -dQUIET -dINTERPOLATE -dSAFER -dBATCH -dNOPAUSE -dPDFSETTINGS=/ebook -dNumRenderingThreads=4 -sDEVICE=pgmraw -r300 -dTextAlphaBits=4 -sProcessColorModel=DeviceGray -sColorConversionStrategy=Gray -dOverrideICC -o {.}/{.}-%03d.pgm {}' ::: *.pdf
}
export -f generate_pgm
ocr() {
PGM="$1"
find . -name \*.pgm | parallel 'tesseract {} {.} -l deu_frak && rm {.}.pgm'
rm "$PGM"
}
export -f ocr
time parallel -j 4 --progress --eta 'generate_pgm {}; parallel --argsep ,,, ocr ,,, pgm/*.pgm' ::: *pdf
不幸的是,它没有成功,因为这个脚本基本上和我原来的脚本一样。它将创建所有 PDF 的文件夹并开始将所有 PDF 转换为 PGM,同时在第一个 PGM 图像上启动 OCR,而不是在开始接下来的四个之前对每四个 PDF 进行所有处理。
【问题讨论】:
标签: pdf parallel-processing ocr tesseract