단일 인수의 경우 xargs –replace / -I cp, rm)에 대한 것 같습니다. 예를 들어,

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에서 실행 중 입니다.



답변

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

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

답변

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

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과 함께 사용할 수 없습니다.