"find -print0" 사용에 어떤 문제가 있나요? [폐쇄]

"find -print0" 사용에 어떤 문제가 있나요? [폐쇄]

나는 이 실험(Bash에서)으로 인해 혼란스러워졌습니다.

$ mkdir 'foo\n'
$ find . -print0 | od -c
0000000   .  \0   .   /   f   o   o   \   n  \0
0000012

보시다시피 "find"는 null 문자를 올바르게 사용하여 출력을 구분하지만 백슬래시 "n"을 사용하여 디렉터리 이름의 줄 바꿈을 "foo\n"으로 이스케이프합니다. 왜 이런 일을 하는가? "-print0"이라고 말했는데 "이렇게 하면 개행 문자가 포함된 파일 이름이 찾기 출력을 처리하는 프로그램에서 올바르게 해석될 수 있습니다." 대신 "\0"이 구분 기호이므로 이스케이프 처리가 필요하지 않습니다. \N".

답변1

문제는 가 아니라 find이 디렉터리를 어떻게 만드는가입니다. 작은따옴표로 묶인 문자열은 'foo\n'실제로 5자 문자열이며, 마지막 두 문자는 백슬래시와 소문자 "n"입니다.

큰따옴표도 도움이 되지 않습니다. 왜냐하면 셸에서 큰따옴표로 묶인 문자열은 백슬래시를 이스케이프 문자로 사용하지만 실제로는 C 스타일 백슬래시 시퀀스를 해석하지 않기 때문입니다.

bash 또는 zsh(Debian/Ubuntu에서는 dash가 아님)와 같은 셸에서는 $'...'다음 시퀀스를 해석하는 를 사용할 수 있습니다.

$ mkdir $'foo\n'

(배쉬 참조문서이 기능을 "ANSI C 인용"이라고 합니다.

Bourne 쉘 호환 쉘에서 작동하는 또 다른 옵션은 다음을 삽입하는 것입니다.실제새로운 팀:

$ mkdir 'foo
'

Return이는 첫 번째 줄 끝에 있는 실제 값이며 두 번째 줄에는 닫는 작은따옴표만 있습니다.

답변2

새 줄을 추가하여 이름이 지정된 디렉터리를 만들어 보겠습니다 foo.

$ mkdir $'foo\n'

이제 find를 사용해 봅시다:

$ find .  -print0 | od -c
0000000   .  \0   .   /   f   o   o  \n  \0
0000011

\n탈출구가 없습니다.

문제는 이름 뒤에 가 오는 것으로 mkdir 'foo\n'해석된다는 것입니다 . 다음을 통해 이를 확인할 수 있습니다.foo\n

$ printf '%s' 'foo\n' | od -c
0000000   f   o   o   \   n
0000005

관련 정보