Використання xargs з введенням файлу


41

Скажіть, у мене є файл із наступним

bob
john
sue

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

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


Я не зовсім слідкую за цим запитанням, вибачте. Зокрема, я не впевнений, що "я не знаю, що передано команді, яка виконується",
Майкл Мрозек

1
@Michael: Коли ви запускаєте список, xargsвін розбиває його на рядок і подає кожен рядок у команду, правда? Як я можу отримати доступ до цього, якщо мені потрібно сказати щось на зразок cat file | xargs curl http://example.com/[PASSED FROM FILE].tar?
Джош К

Відповіді:


70

Майкл відповідь є правильним, і повинен розібратися в вашій проблемі. Біг

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

1
Однак у моєму прикладі файлів це може бути не ідеально,cat xaa xab xac xad ... xargs ...
Josh K

10
@Josh Чомусь люди, як правило, сприймають непотрібні коти справді серйозно; Мене вже двічі відхиляли
Майкл Мрозек

2
для запису ви отримали +1 від мене. Думаю, що catце справді добре, просто хочеться додати більше інформації ... :)
Стефан

Звичайно, це має бути xargs -I % curl …( параметр xargs до curlта його параметри / аргументи). Принаймні xargs curl -I %(де -I %мається на увазі як опція xargs , а не curl ) не є портативною.
Кріс Джонсен

@Chris, приємний улов, tnx. фіксований.
Стефан

16

Я думаю, ви запитуєте, як вставити окремі рядки, витягнуті зі xargs'stdin посеред команди, замість того, щоб завжди вставляти їх в кінці завжди. Якщо так, -Iпрапор бере replacement-stringаргумент; xargsПотім буде замінено replacement-stringв команді рядком, прочитаним з stdin:

$ cat file | xargs -I foobar curl http://example.com/foobar.tar

Гаразд, а як curl http://example.com/foobar.tar > foobar.tar?
Джош К

2
@Josh K: >це конструкція оболонки, і вона не працюватиме xargs. З іншого боку, curl -oви запишете у названий файл замість stdout, як і те, що wgetробить, так що, напевно, ви б хотіли тут використовувати.
ефеміент

9
$ man xargs
...
       --arg-file = файл
       -файл
              Читайте елементи з файлу замість стандартного введення. Якщо ви використовуєте це
              варіант, stdin залишається незмінним при виконанні команд. Інший-
              мудрий, stdin переспрямований з / dev / null.
...

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


З іншого боку, якщо ви просто намагаєтесь перетворити кожен рядок у файлі в URL,

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

зробимо, і якщо ви хочете отримати їх усі, просто вставте це .| wget -i


8

ще один спосіб з циклічною оболонкою:

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

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



@Sorpigal Ця URL-адреса зламана. Що таке "Класична помилка"?
starbeamrainbowlabs

@starbeamrainbowlabs - марне використання кота, я поставив кешовану версію цього посилання у коментарі вище.
slm

@starbeamrainbowlabs: Я спеціально посилався на " Небезпечні" , але використання котів також зайве, якщо ви перейдете на деякий час конструкцію:while IFS= read i ; do curl ... ; done < file
Sorpigal


1

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

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

0

Це більш загальна версія відповіді Стефана: s, але я використовую awk в середині, щоб підготувати точний "рядок", який я хотів би виконати xargs. І тоді xargs використовує bash, щоб зробити фактичну "роботу".

Для цього прикладу є трохи зайвим, але це загальне рішення, яке за допомогою деяких модифікацій може вирішити багато проблем ...

cat file | awk '{print "curl http://example.com/persons/"$1".tar"}' | xargs -0 bash -c
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.