zsh 재귀 glob에서 디렉터리 이름 제외

zsh 재귀 glob에서 디렉터리 이름 제외

저는 Linux에서 zsh를 실행하고 있습니다 setopt extended_glob ksh_glob glob_dots. 저는 명령줄에 입력하기 쉽고 이식성 요구 사항이 없는 것을 찾고 있습니다. 소스 트리를 보고 있는데 "이상한" 파일 이름이 없습니다(예: \파일 이름이 없거나 로 시작하는 파일 이름이 없습니다 -).

다음 명령 중 하나는 현재 디렉터리의 하위 디렉터리 목록을 재귀적으로 인쇄합니다.

find -type d
print -l **/*/

이것은 실제로 svn 체크아웃입니다:

$ find -type d
./.deps
./.svn
./.svn/text-base
./.svn/prop-base
./.svn/tmp
./.svn/tmp/text-base
./.svn/tmp/prop-base
./.svn/tmp/props
./.svn/props
./lib/.svn
./lib/.svn/text-base
./lib/.svn/prop-base
./lib/.svn/tmp
./lib/.svn/tmp/text-base
./lib/.svn/tmp/prop-base
./lib/.svn/tmp/props
./src/.svn
./src/.svn/text-base
./src/.svn/prop-base
./src/.svn/tmp
./src/.svn/tmp/text-base
./src/.svn/tmp/prop-base
./src/.svn/tmp/props

.svn각 디렉터리 내에 존재하는 디렉터리와 해당 하위 디렉터리를 제외하고 싶습니다 . 그것은 간단합니다 find:

find -type d -name .svn -prune -o -print

짧은 zsh glob으로 이 작업을 수행할 수 있나요? 도트 파일 무시가 완료되었습니다(이미 glob_dots설정 했으므로 명시적으로 수행해야 합니다 ).

print -l **/*(/^D)

.deps그러나 이것은 내가 정말로 보고 싶은 디렉토리를 숨기기 때문에 만족스럽지 않습니다 . 다음을 포함하는 경로를 필터링할 수 있습니다 .svn.

print -l **/*~(*/|).svn(|/*)(/)

find하지만 이는 (그러면 zsh를 무엇에 사용합니까?) 것보다 약간 짧을 뿐입니다. 로 단축할 수도 있지만 print -l **/*~*.svn*(/)이렇게 하면 이름이 지정된 디렉토리도 필터링됩니다 hello.svn. 또한 zsh는 .svnNFS 또는 Cygwin에서 약간 느린 디렉터리를 탐색합니다.

재귀 전역(또는 더 나은: 임의 패턴)에서 특정 디렉터리 이름을 제외하는 편리한(입력하기 쉬운) 방법이 있습니까?

답변1

Zsh의 확장된 glob 연산자는 일치를 지원합니다 /(ksh와 달리 zsh 구현에서도). Zsh는 (0회 이상 반복) **/의 단축어 입니다. 그래서 내가 해야 할 일은 그것을 (다른 것)으로 바꾸는 것뿐입니다.(*/)#*/*^.svn.svn

print -l (^.svn/)#

정돈된!

답변2

options 을 사용해도 와일드카드는 그다지 좋지 않지만 다음을 ksh93사용하여 얻을 수 있습니다.zshglobstarksh93

set -o globstar
FIGNORE='@(.|..|.svn)'
printf '%s\n' **/

관련 정보