여러 패턴과 일치하는 경로를 제외하려면 "찾기"를 사용하세요.

여러 패턴과 일치하는 경로를 제외하려면 "찾기"를 사용하세요.

목록을 생성한 후 문자열을 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(및 대부분의 다른 셸)에 내장된 구문이므로 괄호를 사용하고 인용해야 합니다.

관련 정보