이제 우리 모두는 다음을 사용하지 않는 것에 익숙합니다.
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
빈 문자열인 경우 NULread
문자를 읽을 때 줄이 종료됩니다.
또한 데이터에서 측면 공백 자르기를 IFS
중지하기 위해 빈 문자열로 설정하고 백슬래시가 포함된 문자열을 올바르게 읽을 수 있도록 with를 사용할 수도 있습니다. 줄 바꿈, 공백, 파일 이름 와일드카드 등이 포함된 검색 경로를 지원하도록 스크립트 또는 셸 함수를 원하는 경우 큰따옴표 확장도 필요합니다.read
read
-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 {} +
관련 주제: