我有一个包含大量图像的文件夹。我有一个代码将这些图像转换为黑白格式,然后使用tesseract将它们转换为文本文件。我一直在使用以下代码将这些文件拆分为子组:
i=0; for f in *; do d+dir_$(printf %03d $((i/(number of files in each folder+1))); mkdir -p $d; mv "$f" $d' let i++; done
这个命令可以很好地分割文件(将分组的文件放到不同的文件夹中)但是因为我打算对很多文件使用这个程序,我想把这个过程改成更少的时间(这也需要一点时间)将文件移动到文件夹的时间很长)。有没有办法可以指定文件子组以运行进程并使用&以便一次执行多个实例?例如,我想在文件夹中运行firt 400文件的进程,然后使用“&”以便为401-800的文件运行相同的进程。
这是我用于转换的代码:
parallel -j 5 convert {} "-resample 200 -colorspace Gray" {.}BW.png ::: *.png ; parallel -j 5 tesseract {} {} -l tla -psm 6 ::: *BW.png ; rm *BW.png
按组我只是指前400个文件,第二组是以下400个文件,依此类推......
我会让Make来处理多处理,使用这样的Makefile:
Makefile文件:
EXT_IN := .jpg
EXT_OUT := .txt
FILES_IN := $(wildcard *$(EXT_IN))
FILES_OUT := $(addsuffix $(EXT_OUT), $(basename $(FILES_IN)))
.PHONY: all
$(FILES_OUT):
@echo Generating $@ from $(addsuffix $(EXT_IN), $(basename $@))
# Do your conversion here!
all: $(FILES_OUT)
@echo "Processing finished!"
运行:
$ > make all -j 8
Generating file1.txt from file1.jpg
Generating file2.txt from file2.jpg
Generating file3.txt from file3.jpg
Generating file4.txt from file4.jpg
Generating file5.txt from file5.jpg
Generating file6.txt from file6.jpg
Processing finished!
所以我的整个考验是试图在包含大量文件的目录上使用我的代码。为了摆脱错误说明有太多参数的错误,我使用了从以前的Ole Tange帖子收集的代码:
ls ./ | grep -v '\BW.png' | parallel -j 60 convert {} "-resample 100 -colorspace Gray" {.}BW.png; ls ./ | grep \BW.png | parallel -j 60 tesseract {} {} -l tla -psm 6; find . -name "*BW.png" -print0 | xargs -0 rm;
感谢所有贡献的人。