Скажем, у меня есть файл со следующим
bob
john
sue
Теперь они непосредственно corrospond к (в данном случае) модель URL , такие как http://example.com/persons/bob.tar
, john.tar
, sue.tar
.
Я хотел бы взять эти строки и провести их через xargs
. Я не знаю, что передается команде, хотя выполняется. Как получить доступ к параметру либо из приглашения (скажем, я хочу просто отобразить каждую строку, как cat file | xargs echo $PARAM
), либо из сценария bash.
xargs
он разбивает его на строки и передает каждую строку в команду, верно? Как я могу получить доступ к этому, если мне нужно сказать что-то вродеcat file | xargs curl http://example.com/[PASSED FROM FILE].tar
?Ответы:
Майкл ответ правильный, и должен решить вашу проблему. Бег
загрузит файлы,
bob.tar
john.tar.
sue.tar
как и ожидалось.НО : кошка здесь бесполезна
скорее используйте:
источник
cat xaa xab xac xad ... xargs ...
cat
действительно хорошо, просто хотел бы добавить больше информации ... :)xargs -I % curl …
( опция xargs beforecurl
и ее параметры / аргументы). По крайней мереxargs curl -I %
(где-I %
это подразумевается как опция для xargs , а не curl ) не является переносимым.Я думаю, вы спрашиваете, как вставить отдельные строки, извлеченные из
xargs
'stdin, в середину команды, вместо того, чтобы просто вставлять ее в конец всегда. Если это так,-I
флаг принимаетreplacement-string
аргумент;xargs
затем заменимreplacement-string
в команде строку, прочитанную из stdin:источник
curl http://example.com/foobar.tar > foobar.tar
?>
это оболочка конструкций, и не будет работать дляxargs
. С другой стороны,curl -o
будет записывать в именованный файл вместо stdout, как, например, тоwget
, что делает, так что это, вероятно, то, что вы хотели бы использовать здесь.Вы также можете установить
--delimiter=
/-d
на'\n'
.С другой стороны, если вы просто пытаетесь превратить каждую строку в файле в URL,
будет делать, и если вы хотите получить все из них, просто передать это в .
| wget -i
источник
Другой способ с циклом оболочки:
Вы также можете запустить каждую итерацию в фоновом режиме, добавив
&
перед последней точкой с запятой - для очень больших загрузок это может быть удобноисточник
while IFS= read i ; do curl ... ; done < file
С GNU Parallel вы можете делать:
Или:
Посмотрите вступительное видео для GNU Parallel, чтобы узнать больше: http://www.youtube.com/watch?v=OpaiGYxkSuQ
источник
while read VAR; do ... done
цикл простой, но очень универсальный:источник
Это более общая версия ответа Стефана, но я использую awk в середине, чтобы подготовить точную «строку», которую я хотел бы выполнить xargs. И тогда xargs использует bash, чтобы выполнить настоящую «работу».
Это немного излишне для этого примера, но это общее решение, которое с некоторыми изменениями может решить многие проблемы ...
источник