목록을 생성한 후 문자열을 sed로 대체하기 위해 중첩된 YAML 및 HTML 파일을 찾으려고 합니다. 해당 -prune
옵션을 사용하는 방법을 완전히 이해하지 못했습니다. 이것이 제가 가진 것입니다.
find . -type f -name '*.yaml' -or -name '*.html' \
-and -path './.git/*' -or -path '*/node_modules/*' -prune
이를 위해 나는 여전히 node_modules
디렉토리 아래에 HTML 파일을 얻습니다.
답변1
검색 트리에서 .git
또는 이름의 디렉토리를 제거하려면 다음을 사용할 수 있습니다.node_modules
-type d \( -name .git -o -name node_modules \) -prune
find
이로 인해 해당 디렉토리에 들어갈 수도 없게 됩니다 ( -type d
꼭 필요한 것은 아니지만 여기서는 ;와의 대칭을 위해 사용하겠습니다 -type f
. 아래 참조).
그런 다음 다른 조건을 추가하면
-type d \( -name .git -o -name node_modules \) -prune -o \
-type f \( -name '*.yaml' -o -name '*.html' \) -print
다음으로 끝남
find . \
-type d \( -name .git -o -name node_modules \) -prune -o \
-type f \( -name '*.yaml' -o -name '*.html' \) -print
모든 테스트를 통과한 경로 이름에 대해 수행하려는 모든 작업을 대신 수행해야 합니다 -print
.
두 조건자 간의 기본 논리 연산은 -a
(AND)입니다.
답변2
man find
find에 대한 자세한 정보를 찾을 수 있는 좋은 장소입니다.
이것은 당신에게 도움이 될 것입니다.
find . \
-type f \
'(' -name '*.yaml' -or -name '*.html' ')' -and \
-not '(' -path './.git/*' -or -path '*/node_modules/*' ')'
괄호는 bash(및 대부분의 다른 셸)에 내장된 구문이므로 괄호를 사용하고 인용해야 합니다.