-print를 명시적으로 추가할 때 find(1)의 동작이 다른 이유는 무엇입니까?

-print를 명시적으로 추가할 때 find(1)의 동작이 다른 이유는 무엇입니까?

매뉴얼 페이지는 다음과 같이 find(1)말합니다.

표현식에 이외의 작업이 포함되어 있지 않으면 -prune표현식 -print이 true인 모든 파일에 대해 이 수행됩니다.

그러나 이 두 표현에는 차이가 있는 것 같습니다.

$ find . -path '*fo*' -prune -o -type f -print
./bar/xzyzzy
$ find . -path '*fo*' -prune -o -type f
./foo
./bar/xzyzzy

./foo후자의 출력에 왜 포함됩니까 ?

다음을 사용하여 위의 예제 디렉터리 트리 구조를 만들었습니다.

$ cd $(mktemp -d)
$ mkdir foo
$ mkdir bar
$ touch foo/quux
$ touch bar/xzyzzy

find --version나를 위한 결과는 다음과 같습니다.

find (GNU findutils) 4.4.2`

답변1

아, 제가 직접 해결한 것 같아요...

전자의 경우 다음이 -print수행됩니다.오직-path '*fo*'의 단락 동작으로 인해 첫 번째 조건( )이 참이 아닐 때 -o.

그러나 두 번째 경우에는 암시적 -print작업이 수행됩니다.전체-path '*fo*'표현식이 true인 경우 - is 가 true 인 경우에도 마찬가지입니다.또는 -type f사실이다. 즉, 내 질문의 두 명령은 다음과 같습니다.

$ find . \( -path '*fo*' -prune \) -o \( -type f -print \)
./bar/xzyzzy

... 그리고:

$ find . \( -path '*fo*' -prune -o -type f \) -print
./foo
./bar/xzyzzy

어쨌든 그런 것 같아요 :)

관련 정보