it-swarm-ko.tech

파일에서 xargs를 입력과 함께 사용

다음 파일이 있다고 가정 해보십시오.

bob
john
sue

이제 이것들은 (이 경우) http://example.com/persons/bob.tar, john.tar, sue.tar.

이 줄을 가져 와서 xargs를 통해 실행하고 싶습니다. 그래도 실행중인 명령에 무엇이 전달되는지 모르겠습니다. 프롬프트에서 매개 변수에 액세스하는 방법 (예 : cat file | xargs echo $PARAM) 또는 bash 스크립트에서.

44
Josh K

Michael의 answer 이 맞으며 문제를 정리해야합니다. 달리는

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

파일을 다운로드합니다 bob.tarjohn.tar.sue.tar 예상대로.

[~ # ~] but [~ # ~] : 여기서 고양이는 쓸모가 없습니다

오히려 사용하십시오 :

<file xargs -I % curl http://example.com/persons/%.tar
74
Stefan

나는 명령의 중간에 xargs 'stdin에서 가져온 개별 줄을 항상 끝에 붙여 넣는 대신 삽입하는 방법을 묻고 있다고 생각합니다. 그렇다면 -I 플래그는 replacement-string 인수를 사용합니다. xargs은 명령에서 replacement-string를 stdin에서 읽은 줄로 바꿉니다.

$ cat file | xargs -I foobar curl http://example.com/foobar.tar
17
Michael Mrozek
 $ man  xargs  
 ... 
 --arg-file = file 
 -a 파일 
 항목 읽기 표준 입력 대신 파일에서. 이 
 옵션을 사용하면 명령을 실행할 때 stdin이 변경되지 않습니다. 기타-
, stdin은/dev/null에서 리디렉션됩니다. 
 ... 

--delimiter=/-d에서 '\n'도 마찬가지입니다.


반면에 파일의 각 줄을 URL로 바꾸려고하면

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

모든 것을 가져 오려면 | wget -i.

9
ephemient

쉘 루핑을 사용하는 또 다른 방법 :

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

마지막 세미콜론 앞에 &를 추가하여 백그라운드에서 각 반복을 실행할 수도 있습니다. 매우 큰 다운로드의 경우 편리 할 수 ​​있습니다

8
Brad Clawsie

GNU Parallel을 사용하면 다음을 수행 할 수 있습니다.

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

또는:

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

자세한 내용은 소개 동영상을 참조하십시오 GNU 병렬 : http://www.youtube.com/watch?v=OpaiGYxkSuQ

3
Ole Tange

while read VAR; do ... done 루프는 단순하지만 매우 다양합니다.

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

이것은 Stefan : s의 더 일반적인 버전이지만 xargs를 실행하려는 정확한 "문자열"을 준비하기 위해 중간에 awk를 사용하고 있습니다. 그리고 xargs는 bash를 사용하여 실제 "작업"을 수행합니다.

이 예제에서는 약간 과잉이지만 약간의 수정으로 많은 문제를 해결할 수있는 일반적인 솔루션입니다 ...

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