매개변수 순서가 find로 찾은 파일에 영향을 미치는 이유는 무엇입니까?

매개변수 순서가 find로 찾은 파일에 영향을 미치는 이유는 무엇입니까?

에서 이 이상한 동작을 발견했습니다 find. 인수 순서에 따라 find다른 파일을 찾습니다.

예를 들어, 다음 내용이 포함된 디렉터리 트리가 있습니다.

.
├── configure.ac
├── Makefile.am
└── src
    ├── hello.c
    └── Makefile.am

내가 달리면

find -name '*.cpp' -o -name '*.[chS]' -print0 | xargs -0 echo

그것은 나열

./src/hello.c

내가 달리면

find -name '*.[chS]' -o -name '*.cpp' -print0 | xargs -0 echo

아무것도 나열되지 않습니다. 내가 변경한 유일한 것은 파일 이름의 순서였습니다.

두 번째 명령이 파일을 나열하지 않는 이유를 설명할 수 있는 사람이 있습니까?

답변1

작업 -print0은 두 번째 "필터"(find 인수로 테스트됨)에만 바인딩되므로 -name두 번째 필터가 일치하는 경우에만 무언가가 인쇄됩니다. 이는 조회 표현식의 기본 연산자가 이고 and( )보다 더 밀접하게 바인딩되어 있기 때문입니다. 즉, 두 번째 표현식은 다음과 같이 평가됩니다.or-o

find -name '*.[chS]' -o \( -name '*.cpp' -print0 \) | xargs -0 echo

필터를 그룹화해 보세요.

find \( -name '*.[chS]' -o -name '*.cpp' \) -print0 | xargs -0 echo

원한다면 다음과 같이 할 수도 있습니다.

find -name '*.[chS]' -print0 -o -name '*.cpp' -print0 | xargs -0 echo

관련 정보