Xargs `-J` 옵션

Xargs `-J` 옵션

이 웹사이트명령 인수에서 표준 입력이 원하는 위치로 전달될 수 있도록 xargs명령 에 옵션을 제공합니다.-J

find . -name '*.ext' -print0 | xargs -J % -0 rsync -aP % user@host:dir/

하지만GNU xargs 매뉴얼 페이지이 옵션은 존재하지 않습니다.

이 작업을 허용하는 명령의 경우 이를 수행하는 방법은 무엇입니까?

답변1

이것이 예상한 것인지 확실하지 않지만 BSD 세계(예: macOS)에서는 명령에 여러 "라인"을 전달하는 다양한 방법이 있습니다 -I. -J예:

$ ls
file1 file2 file3

$ find . -type f -print0 | xargs -I % rm %
rm file1
rm file2
rm file3

$ find . -type f -print0 | xargs -J % rm %
rm file1 file2 file3

따라서 -Ixargs는 전달된 각 요소에 대해 개별적으로 명령을 실행합니다. xargs를 사용하면 -J명령을 한 번 실행하고 모든 요소를 ​​연결하여 인수로 함께 전달합니다.

일부 명령(예: rm또는 ) mkdir은 단일 인수를 전달하고 여러 번 실행하는 것처럼 여러 인수를 가져와서 작동할 수 있습니다. 그러나 일부 애플리케이션은 매개변수를 전달하는 방법에 따라 변경될 수 있습니다. 예를 들어 tartar 파일을 만든 다음 파일을 추가하거나 모든 파일을 한 번에 추가하여 tar 파일을 만들 수 있습니다.

$ find . -iname "*.txt" -or -iname "*.pdf" -print0 | xargs -0 -J % tar cjvf documents.tar.bz2 %

답변2

-J이것이 BSD 버전의 표시 라면 xargsGNU가 이와 같은 옵션을 갖고 있다고는 생각하지 않습니다 xargs. -J단일 항목 바꾸기문자열 복사(예를 들어 %) 각 라인은 표준 입력을 통해 들어옵니다. GNU 버전에는비슷한그러나 옵션은 다음과 같습니다. -I1 . 그러나 다음을 사용할 수 있습니다.문자열 복사이 로고를 여러 번 사용하세요.

xargs -I하나 이상의 명령 호출이 있는지 여부가 중요하지 않은 사용 사례의 경우 GNU를 드롭인 대체품으로 사용할 수 있습니다 . 하지만 귀하의 예에서는 이를 사용 rsync하므로 여러 번 호출하고 싶지는 않을 것입니다.

find그렇다면 가장 좋은 방법은 and 또는 연산으로 -exec시작하는 대안을 고려하는 것입니다 -execdir. 이것에는 두 가지 변형이 있습니다. 하나는 GNU와 유사 -I하고 다른 하나는 BSD와 유사합니다 -J. 다음 예를 확인해보세요…

# Note the escaping of ';'
$ find /tmp -name '*.txt' -exec echo {} \;
/tmp/a.txt
/tmp/b.txt
..
/tmp/z.txt

이제 이것을 다음과 비교해 보세요.

$ find /tmp -name '*.txt' -exec echo {} +
/tmp/a.txt /tmp/b.txt .. /tmp/z.txt

둘 사이의 유일한 차이점은 끝에 "수정자"가 나타나는 것 +입니다 ;.

1 더 혼란스러운 점은 BSD 버전도 사용 가능하며 -I그 기능이 -JGNU와 유사하다는 것입니다 -I! 그러나 이는 -I다른 플래그의 영향을 받으며 원하는 플래그가 아닐 가능성이 높습니다.

관련 정보