Powiedz, że mam plik z następującymi informacjami
bob
john
sue
Teraz te bezpośrednio corrospond do (w tym przypadku) wzór URL, takich jak http://example.com/persons/bob.tar
, john.tar
, sue.tar
.
Chciałbym wziąć te linie i je przejrzeć xargs
. Nie wiem jednak, co jest przekazywane do wykonywanego polecenia. Jak uzyskać dostęp do parametru albo z wiersza poleceń (powiedzmy, że chcę po prostu powtórzyć każdy wiersz jak cat file | xargs echo $PARAM
) lub ze skryptu bash.
xargs
, dzieli ją według linii i podaje każdą linię do polecenia, prawda? Jak uzyskać do niego dostęp, jeśli muszę coś powiedziećcat file | xargs curl http://example.com/[PASSED FROM FILE].tar
?Odpowiedzi:
Odpowiedź Michaela jest słuszna i powinna rozwiązać twój problem. Bieganie
pobierze pliki
bob.tar
john.tar.
sue.tar
zgodnie z oczekiwaniami.ALE : kot tutaj jest bezużyteczny
raczej użyj:
źródło
cat xaa xab xac xad ... xargs ...
cat
jest w porządku, po prostu dodaj więcej informacji ... :)xargs -I % curl …
( wcześniej opcja xargscurl
i jej opcje / argumenty). Przynajmniejxargs curl -I %
(gdzie-I %
ma to być opcja xargs , a nie curl ) nie jest przenośny.Myślę, że pytasz, jak wstawić poszczególne linie wyciągnięte ze
xargs
'stdin w środku polecenia, zamiast po prostu wklejać je zawsze na końcu. Jeśli tak,-I
flaga przyjmujereplacement-string
argument;xargs
zastąpireplacement-string
w poleceniu wiersz odczytany ze standardowego wejścia:źródło
curl http://example.com/foobar.tar > foobar.tar
?>
to konstrukcja powłoki i nie będzie działaćxargs
. Z drugiej strony,curl -o
napisze do nazwanego pliku zamiast standardowego wyjścia, tak jak towget
robi, więc prawdopodobnie tego właśnie chciałbyś użyć tutaj.Możesz także ustawić
--delimiter=
/-d
na'\n'
.Z drugiej strony, jeśli próbujesz po prostu zamienić każdą linię w pliku na adres URL,
zrobi, a jeśli chcesz pobrać je wszystkie, po prostu włóż to do .
| wget -i
źródło
inny sposób z zapętleniem powłoki:
możesz także uruchomić każdą iterację w tle, dodając
&
przed ostatnim średnikiem - w przypadku bardzo dużych pobrań może to być przydatneźródło
while IFS= read i ; do curl ... ; done < file
Dzięki GNU Parallel możesz:
Lub:
Obejrzyj wideo wprowadzające do GNU Parallel, aby dowiedzieć się więcej: http://www.youtube.com/watch?v=OpaiGYxkSuQ
źródło
while read VAR; do ... done
Pętla jest prosta, ale bardzo wszechstronna:źródło
To jest bardziej ogólna wersja odpowiedzi Stefana, ale używam awk w środku, aby przygotować dokładnie „ciąg”, który chciałbym wykonać xargs. A następnie xargs używa bash do wykonania „pracy”.
W tym przykładzie jest to trochę przesada, ale jest to ogólne rozwiązanie, które po pewnych modyfikacjach może rozwiązać wiele problemów ...
źródło