find 명령에 -or 및 -exec를 사용할 때 발생하는 문제

find 명령에 -or 및 -exec를 사용할 때 발생하는 문제

-exec와 함께 find의 -or 연산자를 사용했을 때 예상한 결과를 얻지 못했다는 사실을 발견했습니다. .cpp 및 .h 파일을 검색할 때 -exec를 사용하지 않으면 명령이 예상대로 작동합니다.

find . -name '*.cpp' -or -name '*.h'
./file1.cpp
./file1.h
./file2.cpp
./file2.h

그러나 -exec를 사용하면 .h 파일만 전달되는 것 같습니다.

find . -name '*.cpp' -or -name '*.h' -exec echo '{}' \;
./file1.h
./file2.h

좀 더 일반적인 방법을 사용하여 결과를 반환하면 제대로 작동합니다.

echo $(find . -name '*.cpp' -or -name '*.h')
./file1.cpp ./file1.h ./file2.cpp ./file2.h

그러나 -exec가 일반적으로 더 편리하기 때문에 무엇을 잘못하고 있는지 궁금합니다. 저는 Mac OSX 10.9를 사용하고 있는데 Cygwin 터미널에서도 같은 문제가 발생합니다. 여기서 무슨 문제가 있습니까? -exec를 원하는 방식으로 작동시키려면 어떻게 해야 합니까?

답변1

이는 -exe 작업이 -name "*.h"와 연결되어 있기 때문입니다. 표현식 주위에 괄호를 넣으면 작동합니다. 기본 작업은 -print이므로 초기 표현식이 작동합니다.

find . \( -name '*.cpp' -or -name '*.h' \) -exec echo '{}' \;

또한 |를 사용하면 효율성을 위해 |

관련 정보