2015-06-09 3 views
0

У меня есть папка, содержащая много изображений. У меня есть код, который преобразует эти изображения в черно-белый формат, а затем использует 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 

Этой команда отлично работает, чтобы разделить файлы (помещает сгруппированные файлы в разные папки), но так как я планирую использовать эту процедуру для многих многие файлы, которые я хотел бы изменить, чтобы этот процесс был менее трудоемким (для перемещения файлов в папку потребовалось бы слишком много времени). Есть ли способ указать подгруппу файлов для запуска процесса и использовать &, чтобы выполнить несколько экземпляров одновременно? Например, я хотел бы запустить процесс для 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 файлов и так далее ...

+0

Возможно, что-то связано с параметрами 'xargs' и' -P' ('--max-procs') и' -n' ('--max-args') ... – larsks

+0

В этом пространстве осталось достаточно места чтобы разбить приведенные выше команды на одну команду на строку (и исправить ошибки синтаксиса, пока вы на ней). :) – lcd047

+0

Пожалуйста, объясните, что такое * группы *. Также покажите хотя бы частичную иерархию ваших файлов и каталогов, как вы конвертируете их в черно-белые, как вы вызываете 'tesseract', как должны выглядеть результаты и где они должны быть написаны. –

ответ

0

Так все мое испытание было с попытки использовать свой код на каталоге с большим количеством файлов. Для того, чтобы избавиться от errer о том, что существует слишком много аргументов, я использовал этот код, который я собрал из предыдущих постов Оле Танге:

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; 

Спасибо всем, которые внесли свой вклад.

1

я позволил бы сделать, чтобы заботиться о многопроцессорной, используя make-файл, как это:

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 [email protected] from $(addsuffix $(EXT_IN), $(basename [email protected])) 
     # 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!