![find 명령에 -or 및 -exec를 사용할 때 발생하는 문제](https://linux55.com/image/56605/find%20%EB%AA%85%EB%A0%B9%EC%97%90%20-or%20%EB%B0%8F%20-exec%EB%A5%BC%20%EC%82%AC%EC%9A%A9%ED%95%A0%20%EB%95%8C%20%EB%B0%9C%EC%83%9D%ED%95%98%EB%8A%94%20%EB%AC%B8%EC%A0%9C.png)
-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 '{}' \;
또한 |를 사용하면 효율성을 위해 |