패턴과 일치하는 모든 파일에 대해 명령을 실행하고 싶습니다. 하지만 올바른 명령이 나에게 작동하지 않는 것 같고 이유를 모르겠습니다.
$ 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 f
and 표현식은 -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
이것이 왜 괄호가 필요한지 더 명확해지기를 바랍니다.