에서 이 이상한 동작을 발견했습니다 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