find 명령: -또는 옵션이 적용되지 않습니다.

find 명령: -또는 옵션이 적용되지 않습니다.

패턴과 일치하는 모든 파일에 대해 명령을 실행하고 싶습니다. 하지만 올바른 명령이 나에게 작동하지 않는 것 같고 이유를 모르겠습니다.

$ find . -type f -name '*.c' -or -name '*.h' -or -name '*.cpp' -exec ls {} \;
$ ls
script.sh  test.c  test.h

답변1

매뉴얼 페이지에 설명된 대로 표현식을 괄호 안에 추가해 보세요.

find . -type f \( -name '*.c' -or -name '*.h' -or -name '*.cpp' \) -exec ls {} \;

작동해야합니다.

답변2

통과하면 다음과 같은 옵션이 GNU find있습니다 -regex.

find . -type f -regex '.*\.\(c\|h\|cpp\)' -exec ls {} \;

답변3

find -D tree . [expr..]find를 사용하여 원래 명령에 대해 find가 수행하는 작업을 확인할 수 있습니다 .

-type fand 표현식은 -exec ls ..s보다 우선순위가 높은 and나머지 표현식에 적용된다는 점을 이해해야 합니다 or.
따라서 원래 명령은 다음과 같이 구문 분석됩니다. ( (-type f AND -name *.c) OR -name *.h OR (-name *.cpp AND -exec ls)or 는 실제로 삼항이 아닌 이진이므로 a | b | c실제로는 이지만 (a | b) | c아이디어를 얻을 수 있습니다). 이제 다른 경우에는 유효한 명령문이 없기 때문에
find는 파일 일치 이외의 작업을 수행할 수 없다는 것을 알 수 있습니다 (이것이 디버그 출력에서 ​​segfault 또는 유사한 내용을 볼 수도 있는 이유입니다).*.cpp

이것이 왜 괄호가 필요한지 더 명확해지기를 바랍니다.

관련 정보