xargs는 어떤 유형의 명령을 실행할 수 있나요?

xargs는 어떤 유형의 명령을 실행할 수 있나요?

findutils 매뉴얼에서:

xargs [option...] [command [initial-arguments]]

각기 다른 매개변수 순서를 사용하여 여러 번 xargs실행하는 것이 맞나요?command

그렇다면 그러한 명령은 명령에 적용되는 인수의 순서가 다음과 같다는 점을 충족해야 한다는 의미입니까?실제로

  • 매개변수 시퀀스를 하위 시퀀스로 분할하고

  • 다른 실행에서 각 매개변수의 하위 순서로 명령을 실행하시겠습니까?

mycommand예를 들어 다음과 같이 실행할 수 있다면 xargs올바른가요?

mycommand arg1 arg2 arg3

실제로 관련이 있어야 합니다.

mycommand arg1
mycommand arg2 arg3

위의 조건이 주문 실행에 필요하고 충분합니까 xargs?

위의 조건을 만족하지 않는 명령어가 있나요? (찾을 수 없습니다.) 그렇다면 실행이 가능한가요 xargs?

전달된 매개변수는 옵션, 옵션 매개변수 또는 비옵션 매개변수 등 모든 유형의 매개변수 xargs일 수 있습니까? command이 질문은 위의 질문에 답하는 데 도움이 된다고 생각합니다.

그렇다면 -i어떻게 될까요 xargs?

감사해요.

답변1

xargs가 각각 다른 인수 순서를 사용하여 여러 번 실행하여 명령을 실행한다고 생각하는 것이 맞습니까?

xargs예(물론 입력이 반복되지 않는 한)

mycommand arg1 arg2 arg3

실제로 관련이 있어야 합니다.

mycommand arg1
mycommand arg2 arg3

xargs일반적으로 우리는 목록이 어디에서 분할될지 모르기 때문에 거의 그렇습니다 . GNU xargs를 --show-limits사용하면 모든 입력이 단일 명령 실행에 적합한지 여부를 확인할 수 있습니다.

물론 매개변수를 세트로 명령에 전달해야 하는 경우질소, 우리는 그것을 어느 정도 제어하기 위해 사용할 수 있습니다(또는-n N-n M중간 사이즈일부 배수질소).

위의 조건을 만족하지 않는 명령어가 있나요? (찾을 수 없습니다.) 그렇다면 xargs를 통해 실행할 수 있습니까?

Kusalananda는 mv마지막 매개변수가 다른 매개변수와 다르게 처리된다는 것이 문제라고 언급했습니다. 실제로 추가된 매개변수는 xargs중간에 가야 하는데, 이를 수행하는 표준 방법은 없습니다. (FreeBSD xargs가 -J {}이를 수행할 수 있으며 GNU는 선택적으로 인수 목록의 시작 부분에 대상 디렉토리를 전달할 mv수 있습니다 . 이와 비슷한 것입니다.)-t dircp

그러면 (생성)이 실행될 때마다 아카이브를 덮어쓰기 때문에 이와 같은 작업은 tar -czf foo.tar.gz작동하지 않습니다 . 대신 (append)를 사용하면 이를 -c피할 수 있지만 적어도 GNU tar는 압축된 아카이브에 추가하는 것을 지원하지 않습니다.-r-c

다행스럽게도 대부분의 유틸리티는 파일별로 작동하며 마지막에 파일 목록을 허용하도록 설계되었습니다.

xargs 명령에 전달된 인수는 옵션, 옵션 인수 또는 비옵션 인수 등 모든 유형의 인수일 수 있습니까?

그것들은 단지 문자열일 뿐이고, xargs그것이 무엇을 의미하는지 전혀 모릅니다. 일반적인 파일 목록을 허용하지 않지만 유사한 입력을 얻을 -f filename수 있는 옵션을 사용하는 유틸리티가 있는 경우 이를 기꺼이 전달할 것입니다. 크기 제한으로 인해 큰 입력에도 불구하고 a와 파일 이름이 다시 분할 될 수 있지만, 이와 같은 것을 추가하면 이러한 일이 발생할 가능성이 줄어듭니다(파일 이름의 길이와 실제 크기 제한에 따라 다름).xargs-f file1 -f file2 ...-f-n 100

xargs의 -i가 관련되면 어떻게 되나요?

-iGNU에서 xargs는 와 동일하며 -I {}다소 지루하게 xargs각 입력 인수에 대해 명령을 한 번씩 실행합니다. 명령 중간에 매개변수를 넣어야 하는 경우에는 도움이 되지만 명령 호출 횟수를 줄이는 데는 실제로 도움이 되지 않습니다.

답변2

xargs도구는 기본적으로 표준 입력에서 공백으로 구분된 토큰을 읽고 이를 지정된 프로그램에 대한 명령줄 옵션으로 변환합니다. 기본적으로 명령줄에 들어갈 수 있는 만큼의 토큰을 사용하고 해당 토큰으로 명령을 한 번 실행합니다.

echo 1 2 3 | xargs echo "-"
- 1 2 3

여기에서 xargs1, 2, 3을 읽고 실행합니다 echo "-" 1 2 3. 몇 번이나 호출되었는지 "-"파악하는 데 도움이 되도록 추가했습니다 .echo

다음 옵션을 사용하여 명령에 전달되는 인수 수를 제한할 수 있습니다 -n.

echo 1 2 3 | xargs -n2 echo "-"
- 1 2
- 3

여기서는 xargs표준 입력 스트림에서 최대 2개의 토큰을 읽고 다음 토큰을 명령줄 인수로 사용하여 명령을 실행합니다 echo "-" 1 2. 표준 입력에서 토큰 읽기가 완료되지 않았으므로 계속해서 3을 읽고 EOF를 발견하고 나머지 인수를 사용하여 명령을 다시 실행합니다 echo "-" 3.

조정된 값은 n다른 동작을 제공합니다.

echo 1 2 3 | xargs -n1 echo "-"
- 1
- 2
- 3

편집하다:Tim은 내가 그의 질문에 대답하지 않았다고 말했습니다. 나는 이에 동의하지 않으며 다음 답변에서 이를 명확하게 설명하려고 노력할 것입니다.

각기 다른 매개변수 순서를 사용하여 여러 번 xargs실행하는 것이 맞나요?command

나는 그 질문에 대답했다. 한 번 또는 여러 번 실행하여 명령을 실행할 수 있습니다. 기본적으로 command가능한 한 적은 횟수로 실행을 시도합니다 (인수 길이에 따라 제한됨).

그렇다면 해당 명령은 다음 조건을 충족해야 한다는 의미입니까? 명령에 매개변수 시퀀스를 적용하는 것은 실제로 (x) 매개변수 시퀀스를 하위 시퀀스로 분할하고 (x) 각 매개변수 하위 시퀀스를 사용하여 명령을 실행하는 것과 동일합니다. 달리기?

나는 그 질문에 대답했다. 토큰이 너무 길거나 -n옵션에 의해 제한되는 경우 xargs이를 하위 시퀀스로 분할하고 해당 하위 시퀀스를 사용하여 명령을 실행하세요.

위의 조건이 주문 실행에 필요하고 충분합니까 xargs?

이에 대한 명확한 대답은 없지만 예제에서 의미를 추론할 수 있다는 생각입니다. 인수가 command위치에 따라 특별한 의미를 갖는 경우 command아마도 좋은 후보가 아닐 것입니다 xargs(실행 가능한 사례를 만들 수 있다고 확신하지만).

위의 조건을 만족하지 않는 명령어가 있나요? (찾을 수 없습니다.) 그렇다면 xargs를 통해 실행할 수 있습니까?

다시 말하지만, 그러한 케이스를 만들 수 있습니다(그러나 권장하지는 않습니다). 잘 만들어진 예는 다음과 같습니다 mv a.txt b.txt.

$ ls
a.txt
$ echo a.txt b.txt | xargs mv
$ ls
b.txt

xargs 명령에 전달된 인수는 옵션, 옵션 인수 또는 비옵션 인수 등 모든 유형의 인수일 수 있습니까? 이 질문은 위의 질문에 답하는 데 도움이 된다고 생각합니다.

공백으로 구분된 토큰으로 읽혀집니다. 이는 공백으로 구분된 인수로 명령에 전달됩니다. 이것은 다음과 같이 실행됩니다 ls -l:

$ echo -l | xargs ls
total 0
-rw-r----- 1 user group 0 Jun 7 15:16 b.txt

그렇다면 -i어떻게 될까요 xargs?

글쎄, 나는 질문에 대답하지 않았지만 이와 관련하여 당신이 무엇을 요구하는지 잘 이해하지 못합니다.

관련 정보