이 질문에 따르면:검색에서 디렉토리를 제외하는 방법, 명령은 다음과 같아야 합니다.
find . -type d \( -path dir1 -o -path dir2 -o -path dir3 \) -prune -o -print
하지만 내가 그렇게 한다면
find . -type d \( -path "./.cpan" -o -path "./.mozilla" -o "./.cache" \) -prune -o -print
이는 다음을 제공합니다:
find: paths must precede expression: ./.cache'
find: possible unquoted pattern after predicate -o'?
하지만 나는 제안을 했습니다.
그리고 -path
옵션 뒤의 경로는 절대 경로로 해야 할까요, 아니면 상대 경로로 해야 할까요? 현재 디렉토리를 포함시켰기 때문에 ./[somefile]
이것이 필요합니까 -path
?
답변1
-path
마지막 옵션 값 앞에 조건자를 놓쳤습니다."./.cache"
사용되는 경로는 -path
사용 중인 최상위 검색 경로로 시작해야 합니다 find
. 예를 들어
find . -path './something/here'
find /etc -path '/etc/init.d'
*
파일 시스템 트리에서 위치를 지정하지 않고 디렉터리 이름을 일치시키려면 와일드카드를 사용해야 할 수도 있습니다. 이 예는 -type f
디렉토리( )에 있는 모든 파일 과 일치합니다 .wizard
find . -path '*/wizard/* -type f -print
답변2
미래의 독자를 위한 POSIX 호환 솔루션제외된 디렉터리를 탐색하거나 출력에 포함하지 마세요.일반적인 형식은 다음과 같습니다.
단일 제외
find searchpath \! \( -path searchpath/excludepath -prune \)
여러 제외
find searchpath \! \( \( -path searchpath/excludepath1 -o -path searchpath/excludepath2 -o -path 'searchpath/excludepathprefix-*' \) -prune \)
이러한 순회를 방지하면 다음이 가능해집니다.거대한이러한 디렉터리에 많은 파일이 포함되어 있으면 성능이 향상될 수 있습니다. 제외된 디렉터리를 출력에서 완전히 생략하면 해당 디렉터리를 실수로 조작하는 것을 방지할 수 있습니다.
더 많은 필터와 출력 매개변수를 배치할 수 있습니다.뒤쪽에-maxdepth
항상 따르는 항목을 제외하고 모두 표시됩니다 searchpath
. 에 대한 인수는 -path
해당 디렉토리의 출력과 일치해야 하며 find
와일드카드 문자는 이스케이프/따옴표로 묶어야 합니다.
이 문제에 대한 해결책은 다음과 같습니다( -print
기본값이므로).
find . \! \( \( -path ./.cpan -o -path ./.mozilla -o -path ./.cache \) -prune \)
답변3
find 명령이 여러 디렉토리를 제외하도록 하는 정보를 검색할 때 이 페이지를 방문했습니다. 나는 답을 찾았다울프가장 우아합니다. 내 실험에 따르면 동일한 개념을 기반으로 한 변형은 다음과 같습니다.
find . \( -path ./.cpan -o -path ./.mozilla -o -path ./.cache \) -not -prune -o -print