명령을 실행하면 find . -maxdepth 1 -regextype posix-egrep -regex '.*/[a-zA-Z]+\.txt
다음 결과가 반환됩니다.
./testfile.txt
./testread.txt
대조적으로, 명령 find . -maxdepth 1 -regextype posix-egrep -regex '.*/[a-zA-Z]+\.txt' -print0
출력 ./testfile.txt./testread.txt
은 한 줄이며, 제가 이해한 바에 따르면 플래그는 -print0
/replaces를 \n
제거하거나 NUL
구분 \0
기호로 사용합니다.
xargs
후속 명령과 매개변수가 다음과 같이 전달되면 find . -maxdepth 1 -regextype posix-egrep -regex '.*/[a-zA-Z]+\.txt' -print0 | xargs -0 -i echo {}
표시됩니다.
./testfile.txt
./testread.txt
'{}'
플래그가 사용되고 공백과 같은 문자가 오류 없이 처리되므로 후속 단계가 필요하지 않다고 가정합니다 .echo
-print0
다음 명령은 모두 단일 행을 생성합니다.
find . -maxdepth 1 -regextype posix-egrep -regex '.*/[a-zA-Z]+\.txt' -print0 | xargs -0
find . -maxdepth 1 -regextype posix-egrep -regex '.*/[a-zA-Z]+\.txt' -print0 | xargs -0 echo
xargs
with가 {}
반환한 결과에 개행 문자가 포함된 이유 는 무엇 입니까?
개행 문자가 추가 되면 {}
왜 명령과 함께 사용합니까 echo {}
?
답변1
GNU의 경우 xargs
이 -i
옵션(더 이상 사용되지 않음)은 와 동일합니다 -I {}
. 이는 "유틸리티에서 나타나는 문자열을 {}
표준 입력의 항목으로 바꾼 다음 유틸리티를 실행하고 표준 입력의 다음 항목으로 반복한다"는 의미입니다.
유틸리티 호출은 이고 echo {}
에 두 가지를 전달합니다 . 이는 표준 입력에서 항목 중 하나를 읽을 때마다 두 번 xargs
호출하는 것을 의미합니다 . echo
각 호출은 후행 개행 문자를 출력합니다 echo
(이는 의 기능입니다 echo
).
echo {}
및 가 -i
없으면 표준 xargs
입력에서 가능한 한 많은 항목을 수집하여 echo
동시에 모두 호출한 것처럼 출력합니다.
즉, xargs
개행을 추가하는 대신 echo
개행을 추가하십시오. 여러 번 호출하기 때문에 이렇게 됩니다.
예( 무엇을 하는지 보여주기 -t
위해 추가됨 ):xargs
$ printf 'file1\nfile2\n' | xargs -t -I {} echo {}
echo file1
file1
echo file2
file2
$ printf 'file1\nfile2\n' | xargs -t echo
echo file1 file2
file1 file2
답변2
개행 문자는 echo
다음과 같이 추가됩니다.아니요통과 xargs
.
사용법의 차이점 -i
은 이 옵션이 -L 1
명령당 한 줄 또는 하나의 Null로 구분된 필드를 강제하기 때문입니다. 따라서 echo
각 입력 필드는 한 번 실행되므로 필드 사이에 줄 바꿈이 있습니다( echo
일반적으로 완료 시 줄 바꿈이 추가됩니다).
not -i
이고 따라서 not 인 경우 -L 1
각 echo는 더 많은 필드를 수신하므로 대부분의 필드는 공백으로 구분됩니다(echo는 인수를 공백으로 구분하여 연결합니다).