zsh : 패턴에서 파일 제외


18

다음 파일이 있다고 가정 해보십시오.

|-- bar
`-- foo
    |-- type_A_1
    |-- type_A_2
    |-- type_B_1
    |-- type_B_2
    |-- type_B_xx
    |-- type_B_xx
    `-- something_else

나는 다음 명령을 생각했다

print -l foo/*~{type_B*}

인쇄 할 모든 것을 에서 foo 제외 로 시작하는 것들 type_B이지만, 대신은 foo는 아래에 모든 것을 출력하지 않습니다

foo/type_A_1
foo/type_A_2
foo/type_B_1
foo/type_B_2
foo/type_B_xx
foo/something_else

나는 또한 print -l foo/*~type_B같은 것을 시도 하고 얻었다.

~zsh에서 예외 와일드 카드는 어떻게 작동합니까?

답변:


10

디렉토리를 예외에 포함시켜야합니다 : print -l foo/*~foo/type_A*또는 print -l foo/*~{foo/type_A*}.

원하는 경우 디렉토리를 와일드 카드로 바꿀 수 있습니다. print -l foo/*~*/type_A*


감사! 두 번째 패턴에 대해 패턴의 foo/*~*/type_A*작동 방식을 설명 하시겠습니까? 두 번째 는 작업 디렉토리 아래의 모든 폴더로 *확장 됩니까?foo 합니까?
Amelio Vazquez-Reina

@roseck 정말 빠르기 때문에 (예를 들어 디렉토리 print *~**/*에서 실행할 때 /) 먼저 첫 번째 패턴을 확장 한 다음 제외 패턴에 맞는 모든 일치 항목을 제거한다고 가정합니다.
jofel

2
@roseck ~는 순전히 텍스트이며, ~확장 하기 전의 부분은 항상 그렇듯이 확장되고, 그 후의 부분은 일치합니다. feljofel 더 나은 시험은print /**/*~* 같습니다. 아무것도 인쇄하지 않더라도 전체 트리를 가로 지르는 것을 볼 수 있습니다.
Gilles 'SO- 악마 그만두 다'

나는 그가 type_B를 제외하고 싶지만 type_A를 포함하고 싶다고 생각했습니다.
systemovich

정답은 다음과 같습니다
aryndin

30

^EXTENDED_GLOB가 켜져있을 때 zsh 는 glob 연산자를 갖 습니다. 명시된 상황에 완벽하게 맞는 것 같습니다.

setopt extendedglob
print -rl foo/^type_A*

"다음 패턴과 일치하는 것을 제외하고는 무엇이든 일치"를 의미하지만 그 효과는 슬래시 사이 또는 패턴의 시작과 첫 번째 슬래시 사이 (또는이 경우와 같이) 마지막 부분 사이의 패턴 부분으로 제한됩니다. 슬래시와 패턴의 끝.

다음 과 같이 현재 활성화 된 zsh 옵션을 볼 수 있습니다 .

setopt

다음을 사용하여 EXTENDED_GLOB를 비활성화하십시오.

unsetopt extendedglob
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.