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


41

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

bob
john
sue

지금이 바로 같은 URL 패턴 (이 경우)에 corrospond http://example.com/persons/bob.tar, john.tar, sue.tar.

나는이 라인들을 가지고 가고 싶다 xargs. 그래도 실행중인 명령에 무엇이 전달되는지 모르겠습니다. 프롬프트 (예 :)처럼 cat file | xargs echo $PARAMbash 스크립트에서 매개 변수에 액세스하는 방법은 무엇입니까 ?


질문을 잘 따르지 않아서 죄송합니다. 특히 "어떻게 명령을 전달해야할지 모르겠다"는
말이

1
@ 마이클 : 당신이 목록을 통해 실행하면 목록을 xargs한 줄씩 나누고 각 줄을 명령에 넣습니다. 같은 말을해야한다면 어떻게 접근 할 수 cat file | xargs curl http://example.com/[PASSED FROM FILE].tar있습니까?
Josh K

답변:


69

마이클의 대답 은 옳으며 문제를 정리해야합니다. 달리는

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정보를 추가하고 싶을 때 사용하는 것이 좋습니다. :)
Stefan

반드시 xargs -I % curl …( xargs 옵션 curl및 옵션 / 인수) 이어야합니다 . 적어도 xargs curl -I %( 말고 xargs에-I % 대한 옵션을 의미합니다 ) 이식성이 없습니다.
Chris Johnsen

@Chris, 좋은 캐치, tnx. 결정된.
Stefan

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어때?
Josh K

2
@Josh K : >는 쉘 구조이며 작동하지 않습니다 xargs. 반면 curl -o에 stdout 대신 이름이 지정된 파일에 쓰는 wget것이므로 아마도 여기에서 사용하고 싶을 것입니다.
ephemient

9
$ 남자 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

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


2
당신은 고전적인 실수 중 하나에 빠졌습니다 ! <-끊어진 링크, 여기 캐시 된 버전이 있습니다 : 쓸모없는 고양이 상 사용 .
Sorpigal

@Sorpigal URL이 깨졌습니다. '클래식 블 런더'란 무엇입니까?
starbeamrainbowlabs

@starbeamrainbowlabs-쓸모없는 고양이 사용, 위의 주석에 캐시 된 버전의 링크를 넣었습니다.
slm

@starbeamrainbowlabs : 나는 특별히 Dangerous Backticks에 링크하고 있었지만, 잠시 구조로 바꾸면 고양이를 쓸 필요도 없습니다 :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

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

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

cat file | awk '{print "curl http://example.com/persons/"$1".tar"}' | xargs -0 bash -c
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.