개행 문자가 포함된 파일 이름 읽기

개행 문자가 포함된 파일 이름 읽기

이제 우리 모두는 다음을 사용하지 않는 것에 익숙합니다.

find . -print | xargs cmd

하지만 사용

find . -print0 | xargs -0 cmd

예를 들어 줄 바꿈이 포함된 파일 이름을 처리하려면 내 스크립트의 줄은 어떻습니까?

find $@ -type f -print | while read  filename

글쎄, 나는 이것이 다음과 같을 것이라고 생각했습니다.

find $@ -type f -print0 | while read -d"\0" filename

내가 이렇게 하면:

 find $@ -type f -print0 | while read filename

NULL이 표시되나요?

하지만,while 루프는 0회 반복 후에 종료됩니다.(두 경우 모두) 읽기가 0을 반환하고 NULL (\0) 을 읽기 때문이라고 가정합니다.

난교 같은 느낌이야읽다운동해야 한다"-0"옵션.

제가 무슨 일이 일어나고 있는지 잘못 읽고 있는 걸까요, 아니면 다른 방식으로 프레임을 구성할 수 있는 걸까요?

이 예에서는 xargs를 사용하기 위해 다시 코딩해야 할 수도 있지만 이는 포크하고 싶지 않은 새로운 프로세스입니다.

답변1

를 사용할 때 다음 null 문자를 읽는 데만 read사용할 수 있습니다 .-d ''

내장 유틸리티에 bash관해 매뉴얼 에서 :read

-d delim
의 첫 번째 문자는 delim개행 문자가 아닌 입력 행을 종료하는 데 사용됩니다. delim빈 문자열인 경우 NUL read문자를 읽을 때 줄이 종료됩니다.

또한 데이터에서 측면 공백 자르기를 IFS중지하기 위해 빈 문자열로 설정하고 백슬래시가 포함된 문자열을 올바르게 읽을 수 있도록 with를 사용할 수도 있습니다. 줄 바꿈, 공백, 파일 이름 와일드카드 등이 포함된 검색 경로를 지원하도록 스크립트 또는 셸 함수를 원하는 경우 큰따옴표 확장도 필요합니다.readread-r$@

find "$@" -type f -print0 |
while IFS= read -r -d '' pathname; do
    # use "$pathname" to do something
done

find개인적으로 긴급하게 필요하지 않은 경우 경로 이름을 전혀 전달하지 않고 필요한 작업을 수행합니다 -exec.

find "$@" -type f -exec sh -c '
    for pathname do
        # use "$pathname" to do something
    done' sh {} +

관련 주제:

관련 정보