У меня есть этот скрипт:
for i in `find ! -newermt "2016-02-13" -name "*svgz"`; do
inkscape --verb FitCanvasToDrawing --verb FileSave --verb FileClose ${i} --verb FileQuit
done
, который ждет, пока inkscape завершит свою работу, а затем перезапустит его со следующим файлом. Я бы хотел, чтобы четыре экземпляра inkscape работали параллельно, чтобы ускорить процесс (у меня есть ~ 5000 файлов для обработки). Это возможно, и если да, то как? Заранее спасибо!
Попробуйте Параллель GNU.
sudo aptitude install parallel
я не использовал его в некоторое время, но его командная строка должна быть подобна той ниже:
find ! -newermt "2016-02-13" -name "*svgz" | \
parallel -j4 \
inkscape \
--verb FitCanvasToDrawing \
--verb FileSave \
--verb FileClose {} \
--verb FileQuit
, где 4 количество процессов, которые Вы хотите выполнить в любой момент времени.
Вот то, как я приблизился бы к этому. Так как у меня нет тех же файлов, рев примера кода имеет целью открывать 4 текстовых файла с gedit
.
, Как это работает? Ну, сначала мы находим файлы в трудно кодированном месте, где файлы могут храниться (FILEPATH
переменная). Затем мы передаем его на while read
структура. Отметьте использование -print0
и IFS= read -d''
. Это очень распространено в программировании удара для устранения проблематичных имен файлов, которые содержат пробелы, непечатные символы, и т.д.
Каждый gedit file &
вызовы gedit
отсоединяемый из сценария с &
. Это заставляет цикл с условием продолжения продолжиться без остановки.
то, Что действительно заставляет цикл остановиться, является переменной КОЛИЧЕСТВА. После того как мы рассчитываем от 0 до некоторого числа делимый 4, MOD
переменная, которая вычисляется от оператора модуля, станет 0. Теперь оболочка будет ожидать всплывающего окна (который является zenity
) подтвердить порождение еще 4 окон. Тем путем мы времена количества 4, переменная сброса, продолжаем.
единственный недостаток здесь - то, что find
не сортирует файлы, таким образом, они не обязательно будут в именованном порядке. Если порядок будет иметь значение, то для кода будут нужны дополнительные инструкции. Иначе это достаточно.
#!/bin/bash
FILEPATH="/home/xieerqi/MYTEXTFILES"
COUNT=0
find $FILEPATH -type f -name "*.txt" -print0 | \
while IFS= read -d '' FILE;
do
gedit $FILE &
COUNT=$(( $COUNT+1 ))
MOD=$(( $COUNT % 4 ))
if [ $MOD -eq 0 ]
then
zenity --question --text "Open 4 more files?" || exit
fi
done
Можно использовать параллель GNU, как объяснено здесь для очень похожего вопроса, также включающего inkscape: https://stackoverflow.com/questions/26572397/how-to-process-20k-svg-files-with-inkscape-cli-mode-align-and-merge-objects
Другой простой прием я использовал меня, недавно следующие:
Хранилище результат находки управляет в текстовом файле
Разделение файл с помощью команды "разделения" в столько заданий, сколько Вы хотите работать параллельно.
Выполнение несколько экземпляров process.sh передающие аргументы ему через сгенерированные файлы разделения и xargs.