xargs -I 동작

xargs -I 동작

변수 var에는 여러 인수가 포함되어 있으며 각 인수는 새 줄로 구분됩니다.

echo "$var" | xargs -I % echo ABC %
#Results in:
#ABC One
#ABC Two
#ABC Three

그러나 -I%문자를 생략하면 다음과 같은 결과가 나타납니다.

echo "$var" | xargs echo ABC
#Results in:
#ABC One Two Three

나는 {}가 현재 인수를 대체할 것이라고 읽은 적이 있지만(find가 하는 것처럼) 그런 일은 일어나지 않습니다. 내가 도대체 ​​뭘 잘못하고있는 겁니까?

답변1

의 일반적인 동작은 xargs실행하는 명령의 명령줄에 가능한 많은 인수를 붙여넣고 모두 완료될 때까지 반복하는 것입니다. 이런 방식으로 사용하면 명령줄 길이 제한 문제에 대한 해결책이 됩니다.

그러나 옵션을 지정하면 -I각 인수에 대해 명령이 실행됩니다.개별적으로, 한번에 한. 나는 그것이 Linux 옵션의 문서에서 완전히 명백하다고 생각하지 않지만 xargs -I그것이 의미하는 바입니다.

-I replace-str
       Replace occurrences of replace-str in the initial-arguments with
       names read from standard input.  Also, unquoted  blanks  do  not
       terminate  input  items;  instead  the  separator is the newline
       character.  Implies -x and -L 1.

답변2

xargs 대신 GNU Parallel을 사용하면 원하는 동작을 제어할 수 있습니다.

# 1 line at a time
echo "$var" | parallel echo ABC {}
# Many lines at a time (divided by # cpu)
echo "$var" | parallel -X echo ABC {} 
# Many lines at a time (not divided)
echo "$var" | parallel -Xj1 echo ABC {} 

GNU Parallel을 설치하는 데 문자 그대로 10초가 걸립니다.

wget pi.dk/3 -qO - | sh -x

자세히 알아보려면 소개 비디오를 시청하세요.https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1

관련 정보