xargs 출력에 개행 문자가 있는 이유는 무엇입니까?

xargs 출력에 개행 문자가 있는 이유는 무엇입니까?

명령을 실행하면 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

xargswith가 {}반환한 결과에 개행 문자가 포함된 이유 는 무엇 입니까?

개행 문자가 추가 되면 {}왜 명령과 함께 사용합니까 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는 인수를 공백으로 구분하여 연결합니다).

관련 정보