다음 파일이 있다고 가정 해보십시오.
bob
john
sue
이제 이것들은 (이 경우) http://example.com/persons/bob.tar
, john.tar
, sue.tar
.
이 줄을 가져 와서 xargs
를 통해 실행하고 싶습니다. 그래도 실행중인 명령에 무엇이 전달되는지 모르겠습니다. 프롬프트에서 매개 변수에 액세스하는 방법 (예 : cat file | xargs echo $PARAM
) 또는 bash 스크립트에서.
Michael의 answer 이 맞으며 문제를 정리해야합니다. 달리는
cat file | xargs -I % curl http://example.com/persons/%.tar
파일을 다운로드합니다 bob.tar
john.tar.
sue.tar
예상대로.
[~ # ~] but [~ # ~] : 여기서 고양이는 쓸모가 없습니다
오히려 사용하십시오 :
<file xargs -I % curl http://example.com/persons/%.tar
나는 명령의 중간에 xargs
'stdin에서 가져온 개별 줄을 항상 끝에 붙여 넣는 대신 삽입하는 방법을 묻고 있다고 생각합니다. 그렇다면 -I
플래그는 replacement-string
인수를 사용합니다. xargs
은 명령에서 replacement-string
를 stdin에서 읽은 줄로 바꿉니다.
$ cat file | xargs -I foobar curl http://example.com/foobar.tar
쉘 루핑을 사용하는 또 다른 방법 :
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
while read VAR; do ... done
루프는 단순하지만 매우 다양합니다.
while read Word; do wget http://example.com/persons/$Word; done < file
이것은 Stefan : s의 더 일반적인 버전이지만 xargs를 실행하려는 정확한 "문자열"을 준비하기 위해 중간에 awk를 사용하고 있습니다. 그리고 xargs는 bash를 사용하여 실제 "작업"을 수행합니다.
이 예제에서는 약간 과잉이지만 약간의 수정으로 많은 문제를 해결할 수있는 일반적인 솔루션입니다 ...
cat file | awk '{print "curl http://example.com/persons/"$1".tar"}' | xargs -0 bash -c