Используя xargs с входом из файла

Я нашел решение (один из возможных), он использует openssl:

$ openssl zlib -d < /tmp/data

или

$ openssl zlib -d -in /tmp/data

*ПРИМЕЧАНИЕ: функциональность zlib по-видимому доступна в недавних openssl версиях> =1.0.0 (OpenSSL должен быть настроен/создан с zlib или zlib-динамической опцией, последний является значением по умолчанию),

41
29.10.2010, 04:54
7 ответов

Ответ Michael является правильным, и должен разобраться в Вашей проблеме. Выполнение

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

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

НО: кошка здесь бесполезна

скорее использование:

<file xargs -I % curl http://example.com/persons/%.tar
72
27.01.2020, 19:35
  • 1
    В моем одном примере файла это не может быть идеально, однако, cat xaa xab xac xad ... xargs ... –  Josh K 29.10.2010, 13:33
  • 2
    @Josh По некоторым причинам люди имеет тенденцию относиться к ненужному использованию кошки действительно серьезно здесь; я был downvoted для него дважды теперь –  Michael Mrozek♦ 29.10.2010, 15:20
  • 3
    для записи, Вы получили +1 от меня. Я думаю с помощью cat прекрасен действительно, точно так же, как для добавления большего количества информации... :) –  Stefan 29.10.2010, 15:25
  • 4
    Конечно, это должно быть xargs -I % curl … (xargs опция прежде curl и его опции/аргументы). По крайней мере xargs curl -I % (где -I % предназначен как опция к xargs, не завихрение) не является портативным. –  Chris Johnsen 05.12.2010, 20:04
  • 5
    @Chris, хорошая выгода, tnx. зафиксированный. –  Stefan 05.12.2010, 21:59

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

$ cat file | xargs -I foobar curl http://example.com/foobar.tar
16
27.01.2020, 19:35
  • 1
    Хорошо, как насчет curl http://example.com/foobar.tar > foobar.tar? Спасибо Gilles –  Josh K 29.10.2010, 06:02
  • 2
    @Josh K: > оболочка конструкции и не будет работать на xargs. С другой стороны, curl -o запишет в именованный файл вместо stdout, как какой wget делает, таким образом, это, вероятно, что требуется использовать здесь. –  ephemient 01.11.2010, 09:23
$ man xargs
...
       --arg-file=file
       -a file
              Read items from file instead of standard input.  If you use this
              option,  stdin  remains unchanged when commands are run.  Other-
              wise, stdin is redirected from /dev/null.
...

Можно хотеть установить --delimiter=/-d кому: '\n' также.


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

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

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

9
27.01.2020, 19:35

иначе с цикличным выполнением оболочки:

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

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

8
27.01.2020, 19:35

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

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

Или:

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

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

3
27.01.2020, 19:35

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

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

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

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

while read word; do wget http://example.com/persons/$word; done < file
1
27.01.2020, 19:35

Теги

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