끝에 -print0을 추가하면 find:s -or가 실패하는 이유는 무엇입니까?

끝에 -print0을 추가하면 find:s -or가 실패하는 이유는 무엇입니까?

저는 디렉토리 트리의 일부 영화를 수정하기 위해 작은 스크립트를 작성 중이고 bash for 루프나 이와 유사한 것을 사용하여 트리를 구문 분석하고 싶습니다.

그래서 파일을 찾기 시작했어요

find -iname *.mov -or -iname *.mkv -or -iname *.avi

그는 예상대로 각 유형의 파일 몇 개를 보여주었습니다.

그러나 나는 이것으로 결과를 반복하려고 시도했습니다(일부 디렉토리 이름에 공백이 있기 때문입니다).

find -iname *.mov -or -iname *.mkv -or -iname *.avi -print0 | while read -d $'\0' line
do
    echo $line
done

하지만 이제 그는 avi 파일만 반환합니다! 그래서 내가 -print0을 추가하면 그는 내 -or와 또 다른 -iname을 무시하는 것 같습니다.

무슨 일이야, 내가 뭘 놓치고 있는 거지?

결과를 반복하기 전에 find 결과를 tmpfile로 보내야 합니까?

답변1

작업은 마지막 테스트( 이 경우) -print0에만 추가됩니다 . -iname *.avi일치하는 항목마다 인쇄 작업을 반복하거나 일부 그룹화를 수행합니다.

find -iname '*.mov' -print0 -or -iname '*.mkv' -print0 -or -iname '*.avi' -print0

또는

find \( -iname '*.mov' -or -iname '*.mkv' -or -iname '*.avi' \) -print0

그리고 맨 페이지 *에서 다음 사항에 주의하십시오 .find

물론 패턴을 인용해야 합니다. 그렇지 않으면 쉘이 패턴에 있는 와일드카드 문자를 확장합니다.

find이 옵션이 있으면 좀 더 간결한 형식을 사용할 수 있습니다.

find -iregex '.*\.\(mov\|mkv\|avi\)$' -print0

-type f(이러한 확장자를 사용하여 디렉터리 이름을 지정하는 경우 이를 추가할 수 있습니다.)

관련 정보