如何通过同步执行自动化文件转换?

时间:2015-06-04 15:31:59

标签: bash automation transformation simultaneous

我正在努力将大量图像文件(png)转换为文本文件。我有基本的代码来逐个执行此操作,这非常耗时。我的过程涉及将图像文件转换为黑白格式,然后使用tesseract将其转换为文本文件。这个过程很有效,但如果逐个文件完成,我需要几天才能完成我的任务。 这是我的代码:

for f in $1
do
 echo "Processing $f file..."
 convert $f -resample 200 -colorspace Gray ${f%.*}BW.png
 echo "OCR'ing $f"
 tesseract ${f.*}BW.png ${f%.*} -l tla -psm 6
 echo "Removing black and white for $f"
 rn ${f%.*}BW.png
done
echo "Done!"

有没有办法同时对每个文件执行此过程,也就是说,我如何能够同时运行此过程而不是逐个运行?我的目标是显着减少将这些图像转换为文本文件所需的时间。

提前致谢。

2 个答案:

答案 0 :(得分:1)

您可以将for循环的内容设为函数,然后多次调用该函数,但将所有内容全部发送到后台,以便执行另一个函数。

function my_process{
    echo "Processing $1 file..."
    convert $1 -resample 200 -colorspace Gray ${1%.*}BW.png
    echo "OCR'ing $1"
    tesseract ${1.*}BW.png ${1%.*} -l tla -psm 6
    echo "Removing black and white for $1"
    rn ${1%.*}BW.png
}

for file in ${files[@]}
do
    # & at the end send it to the background.
    my_process "$file" &
done

答案 1 :(得分:1)

我要感谢贡献者@Songy和@shellter。 为了回答我的问题...我最终使用GNU Parallel来使这些进程以5为间隔运行。这是我使用的代码:

parallel -j 5 convert {} "-resample 200 -colorspace Gray" {.}BW.png ::: *.png ; parallel -j 5 tesseract {} {} -l tla -psm 6 ::: *BW.png ; rm *BW.png

我现在正在拆分我的数据集,以便与我(非常大的)图像池的不同子组同时运行此命令。

干杯