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

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

bob john sue 

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

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

7 Solutions collect form web for “Использование xargs с вводом из файла”

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

 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 

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

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

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


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

 $ sed -e #. * # http: //example.com/persons/&.tar# 'файл

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

другой способ с чередованием оболочки:

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

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

С помощью GNU Parallel вы можете:

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

Или:

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

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

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

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

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

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

 while read word; do wget http://example.com/persons/$word; done < file 
  • Сколько способов конвертировать и передавать stdin в качестве параметра команды?
  • Разный вывод `find | xargs ls` для той же команды в разных версиях Ubuntu
  • Как я могу объединить все файлы в каталоге вместе в одной операции с командной строкой?
  • цикл через выход одной команды и использовать в другой команде
  • Как создать бесконечный поток строк в bash
  • Найти файл, проверить размер и перезаписать, когда размер файла отличается
  • Xargs с несколькими записями аргументов - используйте аргумент переменной окружения после sh -c '...'
  • Что делает эта командная строка (`echo $ 1 | xargs -n 1 basename | cut -d '.' -f1`)?
  • Сделать xargs в качестве первого параметра
  • Отправка списка вакансий в slurm
  • Как распределить вычисления «tar czf» в течение длительного времени?
  • Linux и Unix - лучшая ОС в мире.