it-swarm-ru.tech

Использование xargs с вводом из файла

Скажем, у меня есть файл со следующим

bob
john
sue

Теперь они напрямую соответствуют (в данном случае) шаблону URL, например http://example.com/persons/bob.tar, john.tar, sue.tar.

Я хотел бы взять эти строки и пропустить их через xargs. Я не знаю, что передается команде, хотя выполняется. Как я могу получить доступ к параметру из подсказки (скажем, я хочу просто повторить каждую строку, как cat file | xargs echo $PARAM) или из скрипта bash.

44
Josh K

Майкл ответ прав, и должен решить вашу проблему. Бег

cat file | xargs -I % curl http://example.com/persons/%.tar

будет загружать файлы bob.tarjohn.tar.sue.tar как и ожидалось.

[~ # ~] но [~ # ~] : кошка здесь бесполезна

скорее используйте:

<file xargs -I % curl http://example.com/persons/%.tar
74
Stefan

Я думаю, вы спрашиваете, как вставить отдельные строки, извлеченные из xargs 'stdin, в середину команды, вместо того, чтобы просто вставлять ее в конец всегда. Если так, то -I флаг принимает replacement-string аргумент; xargs затем заменит replacement-string в команде со строкой чтения из stdin:

$ cat file | xargs -I foobar curl http://example.com/foobar.tar
17
Michael Mrozek
 $ man  xargs  
 ... 
 --arg-file = file 
 -a file 
 Читать элементы из файла вместо стандартного ввода. Если вы используете эту опцию 
, Stdin останется неизменным при выполнении команд. Другое - 
 Мудро, stdin перенаправляется из /dev/null.
...

Вы можете установить --delimiter=/-d до '\n' также.


С другой стороны, если вы просто пытаетесь превратить каждую строку в файле в URL,

 $  sed  -e 's. * # http: //example.com/persons/&.tar#' file 

будет делать, и если вы хотите получить их все, просто направьте это в | wget -i.

9
ephemient

другой способ с циклом Shell:

for i in `cat file`; do curl -I http://foo.com/$i; done

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

8
Brad Clawsie

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

cat urls | parallel curl {} ">" {/}

Или:

cat persons | parallel curl http://example.com/persons/{}.tar ">" {}.tar

Посмотрите вступительное видео для GNU Параллельно, чтобы узнать больше: http://www.youtube.com/watch?v=OpaiGYxkSuQ

3
Ole Tange

while read VAR; do ... done цикл простой, но очень универсальный:

while read Word; do wget http://example.com/persons/$Word; done < file
1
musiphil

Это более общая версия ответа Стефана, но я использую awk в середине, чтобы подготовить точную "строку", которую я хотел бы выполнить xargs. И тогда xargs использует bash для выполнения реальной "работы".

Это немного излишне для этого примера, но это общее решение, которое с некоторыми изменениями может решить многие проблемы ...

cat file | awk '{print "curl http://example.com/persons/"$1".tar"}' | xargs -0 bash -c
0
Johan