ускорить сценарий bash, запустив несколько экземпляров цикла for

У меня есть этот скрипт:

 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 файлов для обработки). Это возможно, и если да, то как? Заранее спасибо!

4
задан 29 February 2016 в 14:38

3 ответа

Попробуйте Параллель GNU.

sudo aptitude install parallel

я не использовал его в некоторое время, но его командная строка должна быть подобна той ниже:

find ! -newermt "2016-02-13" -name "*svgz" | \
  parallel -j4 \
    inkscape \
    --verb FitCanvasToDrawing \
    --verb FileSave \
    --verb FileClose {} \
    --verb FileQuit

, где 4 количество процессов, которые Вы хотите выполнить в любой момент времени.

2
ответ дан 1 March 2016 в 00:38
  • 1
    Glad @Ole, которой Это помогло. Я смог воспроизвести почти идентичные настройки темы и планировал включать снимок экрана. Но с тех пор you' ре, которое в состоянии решить все проблемы теперь, я думаю он isn' t необходимый теперь. – Anwar 30 May 2017 в 07:48

Вот то, как я приблизился бы к этому. Так как у меня нет тех же файлов, рев примера кода имеет целью открывать 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
0
ответ дан 1 March 2016 в 00:38
  • 1
    Хорошо я сделал настолько использующую-l опцию и работал, автоудаляют. Как я монтирую его назад теперь? – Reza 29 May 2017 в 12:29

Можно использовать параллель GNU, как объяснено здесь для очень похожего вопроса, также включающего inkscape: https://stackoverflow.com/questions/26572397/how-to-process-20k-svg-files-with-inkscape-cli-mode-align-and-merge-objects

Другой простой прием я использовал меня, недавно следующие:

  1. Создают сценарий оболочки "process.sh", обработка единственного файла передала как аргумент ему.
  2. Хранилище результат находки управляет в текстовом файле

  3. Разделение файл с помощью команды "разделения" в столько заданий, сколько Вы хотите работать параллельно.

  4. Выполнение несколько экземпляров process.sh передающие аргументы ему через сгенерированные файлы разделения и xargs.

1
ответ дан 1 March 2016 в 00:38
  • 1
    Спасибо @Anwar - действительно ценит Вашу справку с этим. Я установил весь материал noobslab прежде, но решил дать гному попытку, так как Единица уходит и нашла что тема в статье человечности OMG. Начиная с I' m в новинку для гнома я был немного потрясен, когда начальная установка темы только изменила мои диалоговые окна:) – Ole 30 May 2017 в 08:22

Другие вопросы по тегам:

Похожие вопросы: