단일 인수의 경우 xargs --replace / -I


10

xargs를 사용하여 제공된 각 인수에 대한 명령을 실행하려고하지만 불행히도 --replace / -I 플래그가 -n과 결합되면 제대로 작동하지 않는 것 같습니다. {}은 -n 옵션에 관계없이 stdin에서 읽은 전체 인수 목록으로 확장되는 것으로 보입니다.

불행히도 웹의 모든 예제는 {}이 확장되는 여러 인수를 취하는 명령 (mv, cp, rm)에 대한 것 같습니다.

예를 들어, 다음을 실행할 때 :

echo a b c d | xargs -n 1 -I {} echo derp {}

출력은 다음과 같습니다.

derp a b c d

그러나 나는 기대했다.

derp a
derp b
derp c
derp d

그러나 -I {}없이 실행하면 예상 결과가 나타납니다.

echo a b c d | xargs -n 1 echo derp
derp a
derp b
derp c
derp d

xargs로 이것을 달성 할 수있는 방법이 있습니까? 나의 궁극적 인 의도는 그것을 사용하여 여러 (병렬) ssh 세션을 실행하는 것입니다.

echo server{1..90} | xargs -n 1 -P 0 -I {} ssh {} 'echo $SOME_HOST_INFO'

xargs (GNU findutils) 4.4.2RHEL 6.3에서 실행 중 입니다.


2
흥미롭게도 BSD xargs에서는 의도 한대로 작동 하지만 GNU에서는 그렇지 않습니다 xargs.
slhck

1
man xargson -I: Also, unquoted blanks do not terminate input items; instead the separator is the newline character. Implies -x and -L 1.따라서 설계된대로 동작합니다.
Daniel Beck

@ André는 tak을 병렬로 실행하려는 것이기 때문에 GNU 병렬을 살펴 보셨습니까? 작업을 훌륭하게 수행합니다. 면책 조항 : 데비안 용으로 패키지했습니다.
rbrito

GNU 병렬은 좋은 대안으로 보였지만 불행히도이 특정 호스트에는 설치할 수 없습니다.
André Fernandes

답변:


5

줄 바꿈으로 에코하여 예상 결과를 얻을 수 있습니다. 서버 확장의 경우 다음과 같습니다.

$ echo -e server{1..4}"\n" | xargs -I{} echo derp {}
derp server1
derp server2
derp server3
derp server4

줄 바꿈 아이디어는 문제를 해결합니다 (정확한 예는 아님). echo server {1..4} | tr '' '\ n'| xargs -I {} echo derp {} derp server1 derp server2 derp server3 derp server4
André Fernandes

죄송합니다. 다음으로 테스트했습니다 zsh. 내 답변을 수정 했습니다 . 옵션이 echo필요합니다 -e.
ahilsend

2

이와 같은 여분의 파이프를 사용할 수 있습니다.

echo a b c d | xargs -n1 | xargs -I{} echo derp {}
derp a
derp b
derp c
derp d

'-n1'옵션 때문에 xargs 'echos'의 각 문자 'abcd'를 개별적으로 사용합니다. 이렇게하면 각 글자가 다음과 같이 자신의 줄에 나타납니다.

echo a b c d | xargs -n1
a
b
c
d 

xargs는 -I (문자열 교체)를 사용할 때 이해하는 것이 중요합니다. xargs는 -L을 의미합니다.이 명령은 유틸리티 명령 (경우에 따라 echo)을 한 줄에 한 번씩 실행합니다. 또한 상호 배타적이므로 -n을 -L과 함께 사용할 수 없습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.