2015-03-11 2 views
1

Существует вход как:обработки файлов с xargs для параллельности

folder1 
folder2 
folder3 
... 
foldern 

Я хотел бы перебрать принимать несколько строк сразу и обрабатывает каждую строку, удалить первый/(и больше, но сейчас это достаточно) и эхо. Итерация в bash одним потоком может быть медленной. Альтернативным способом сделать это будет разделение входного файла на N частей и запуск того же скрипта с разными вводами и выводами N раз, в конце вы можете объединить результаты.

Мне было интересно, возможно ли это с помощью xargs.

Update 1:

Вход:

/a/b/c 
/d/f/e 
/h/i/j 

Выход:

mkdir a/b/c 
mkdir d/f/e 
mkdir h/i/j 

Сценарий:

for i in $(<test); do 
    echo mkdir $(echo $i | sed 's/\///') ; 
done 

Делать это с xargs не работает, как я бы ожидать:

xargs -a test -I line --max-procs=2 echo mkdir $(echo $line | sed 's/\///') 

Очевидно, мне нужен способ выполнения sed на входе для каждой строки, но использование $() не работает.

+0

Вам нужно будет показать, что лучше вы пытаетесь выполнить. Небольшие наборы образцов файлов/данных, за которыми следует ожидаемый результат от этого ввода, значительно облегчат помощь. Удачи – shellter

+0

* ... "и эхо." * 'Echo' что? – tripleee

+1

Вы также должны посмотреть на [Gnu parallel] (http://www.gnu.org/software/parallel/), который помогает работать параллельно. –

ответ

0

Вы, вероятно, хотите:

--max-procs=max-procs, -P max-procs 
      Run up to max-procs processes at a time; the default is 1. If 
      max-procs is 0, xargs will run as many processes as possible at 
      a time. Use the -n option with -P; otherwise chances are that 
      only one exec will be done. 

http://unixhelp.ed.ac.uk/CGI/man-cgi?xargs

0

С GNU Параллельно вы можете сделать:

cat file | perl -pe s:/:: | parallel mkdir -p 

или:

cat file | parallel mkdir -p {= s:/:: =} 
Смежные вопросы