ZSH: 재귀 와일드카드는 지정된 숨겨진 디렉터리를 제외합니다.

ZSH: 재귀 와일드카드는 지정된 숨겨진 디렉터리를 제외합니다.

내 생각에 글로벌 패턴은 다음과 같다.

**/(*|.*)

점( )으로 시작하거나 시작하지 않는 모든 폴더와 파일을 나타내지 .만 현재 디렉터리에서 로 시작하는 디렉터리는 건너뜁니다 ..

글로브 패턴은 무엇을 의미합니까?

.현재 폴더와 다음으로 시작하거나 시작하지 않을 수 있는 더 깊은 폴더의 모든 파일과 폴더

반품:위와 같은 재귀 glob 패턴에서 특정 폴더(또는 더 나은 glob 하위 패턴)를 제외하려면 어떻게 해야 합니까?

.hg현재 레벨에서 폴더를 제외하기 위해 다음을 시도했습니다 (단, .해당 문자로 시작하는 다른 폴더는 포함함).

**~.hg/*

그러나 더 깊은 디렉토리로 재귀적으로 이동하지는 않습니다.

답변1

glob 패턴을 도트 파일과 일치시키는 가장 쉬운 방법은 다음을 사용하는 것입니다.D 글로벌 예선.

**/*(D)

우선 순위 가 ~/으므로 일치 항목이 **~.hg/*차감됩니다 . 그러나 이는 a 이전에만 특별하므로 여기서는 현재 디렉터리의 파일과 일치합니다. 제외하려면 해당 내용이 필요합니다.**.hg/***/.hg

**/*~.hg~.hg/*(D)

zsh는 여전히 .hg디렉토리를 탐색하므로 시간이 걸릴 수 있습니다. 이는 제한 사항입니다 **. 이 수준에서는 제외 목록을 직접 설정할 수 없습니다.

답변2

**/*(D)(의 약어 (*/)#*(D))에는 위에서 설명한 대로 도트파일과 도트디렉터리가 포함됩니다.

모든 수준에서 디렉터리를 제외하려면 다음을 .hg수행해야 합니다.

(^.hg/)#^.hg(D)

(AND 연산자가 필요합니다 setopt extendedglob)^#

언급한 대로 ~pattern항목은 제외됩니다(전체 확장이 "패턴"과 일치하는지 여부에 따라).뒤쪽에목록은 하위 디렉터리로 내려가는 것을 방지하기 위해 생성됩니다.

관련 정보