이 웹사이트명령 인수에서 표준 입력이 원하는 위치로 전달될 수 있도록 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
따라서 -I
xargs는 전달된 각 요소에 대해 개별적으로 명령을 실행합니다. xargs를 사용하면 -J
명령을 한 번 실행하고 모든 요소를 연결하여 인수로 함께 전달합니다.
일부 명령(예: rm
또는 ) mkdir
은 단일 인수를 전달하고 여러 번 실행하는 것처럼 여러 인수를 가져와서 작동할 수 있습니다. 그러나 일부 애플리케이션은 매개변수를 전달하는 방법에 따라 변경될 수 있습니다. 예를 들어 tar
tar 파일을 만든 다음 파일을 추가하거나 모든 파일을 한 번에 추가하여 tar 파일을 만들 수 있습니다.
$ find . -iname "*.txt" -or -iname "*.pdf" -print0 | xargs -0 -J % tar cjvf documents.tar.bz2 %
답변2
-J
이것이 BSD 버전의 표시 라면 xargs
GNU가 이와 같은 옵션을 갖고 있다고는 생각하지 않습니다 xargs
. -J
단일 항목 바꾸기문자열 복사(예를 들어 %
) 각 라인은 표준 입력을 통해 들어옵니다. GNU 버전에는비슷한그러나 옵션은 다음과 같습니다. -I
1 . 그러나 다음을 사용할 수 있습니다.문자열 복사이 로고를 여러 번 사용하세요.
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
그 기능이 -J
GNU와 유사하다는 것입니다 -I
! 그러나 이는 -I
다른 플래그의 영향을 받으며 원하는 플래그가 아닐 가능성이 높습니다.