변수 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