2013-10-24 5 views
2

В настоящее время я создаю около 100 файлов из моего сценария, я хотел бы перебирать через эти файлы в партиях из двадцати и выполнять их через другой скрипт, а затем удалять файлы, когда я это сделаю (очистка) Я считаю, что GNU Parallel может это сделать, но я точно не знаю, как это сделать?Запуск GNU Параллельный файл существует

# test if files exists and run 
if [ "$(ls -A ${base_dir}/schedule)" ]; then 

    while [ "$(ls -A ${base_dir}/schedule)" ]; do 

     # current run of 20 files 
     batch=`ls ${base_dir}/schedule | head -n 20` 

     # parallel run on 4 processors 
     parallel -j4 ./script.sh ${batch} ::: {1..20} 

     # cleanup 
     for file in "${batch}"; do 
      rm "${base_dir}/schedule/${file}" 
     done 

    done 
fi 

ожидается выход будет что-то вроде

# running first batch of twenty 
./scipt.sh 1466-10389-data.nfo # after file has finished, rm 1466-10389-data.nfo 
./scipt.sh 1466-10709-data.nfo # etc 
./scipt.sh 1466-11230-data.nfo # etc 
./scipt.sh 1466-11739-data.nfo 
./scipt.sh 1466-11752-data.nfo 
./scipt.sh 1466-13074-data.nfo 
./scipt.sh 1466-14009-data.nfo 
./scipt.sh 1466-1402-data.nfo 
./scipt.sh 1466-14401-data.nfo 
./scipt.sh 1466-14535-data.nfo 
./scipt.sh 1466-1588-data.nfo 
./scipt.sh 1466-17012-data.nfo 
./scipt.sh 1466-17611-data.nfo 
./scipt.sh 1466-18688-data.nfo 
./scipt.sh 1466-19469-data.nfo 
./scipt.sh 1466-19503-data.nfo 
./scipt.sh 1466-21044-data.nfo 
./scipt.sh 1466-21819-data.nfo 
./scipt.sh 1466-22325-data.nfo 
./scipt.sh 1466-23437-data.nfo 

# wait till all are finished, OR queue up next file so all times 
# twenty files are running at until the directory is empty 

ответ

1

Если я правильно понимаю, что вы хотите сделать, и если файлы в schedule не непрерывно создается, сценарий можно было бы заменить те два линии (не тестировалось)

ls -A ${base_dir}/schedule | xargs -n 1 -P 4 ./script.sh 
rm "${base_dir}/schedule/*" 
+0

Это не выполняет файлы параллельно, он также перекликает все файлы в script.sh как один параметр, и удаляет весь каталог. Это неверно. = (Я обновлю свой вопрос, чтобы он стал более понятным? – ehime

+0

Хорошо, что неправильно понял. Любая причина, почему вы хотите создать партии из 20, а не просто партии из 4? – damienfrancois

+0

Только что понял, что я написал '-p' (print) чем '-P' (параллель). Тем не менее, он действительно подал бы 20 файлов на сценарий. Тогда вместо« -n 20 »вам понадобится' -n 1'. И идея состоит в том, чтобы удалить все в конце. не будет работать партиями по 20. – damienfrancois

1

Я предполагаю, что вы хотите 20 сценариев, работающих постоянно параллельно:

ls -A ${base_dir}/schedule | parallel -j20 ./script.sh {/}\; rm {} 

Ваш цикл while меня немного смущает: это необходимо, потому что во время запуска может быть добавлено больше файлов? Если так что вам нужно добавить, что время цикла:

while [ "$(ls -A ${base_dir}/schedule)" ]; do 
    ls -A ${base_dir}/schedule | parallel -j20 ./script.sh {/}\; rm {} 
done 

Прогулка через учебник http://www.gnu.org/software/parallel/parallel_tutorial.html Ваша командная строка будет любить вас за это.

+0

Удивительно, спасибо! – ehime

+0

Пытаясь сделать это, я не получаю ввода во время tring для выполнения моего следующего файла? – ehime

+0

http://pastebin.com/H1Rw92dP для информации – ehime

Смежные вопросы