ZSH를 사용하여 검색어의 상위 항목 찾기

ZSH를 사용하여 검색어의 상위 항목 찾기

내 하위 디렉터리에 여러 개의 .git 저장소가 있습니다. 그것을 찾으려면 다음을 사용하고 있습니다.

$ echo **/.git        
demo-component-a/.git demo-component-b/.git

이제 실제로 상위 디렉토리가 필요합니다. demo-component-a& demo-component-b.

경로의 상위 경로를 찾는 이 깔끔한 함수를 찾았습니다.

$ var=/home/blueray/Documents/antora/demo-component-b
$ echo $var:h
/home/blueray/Documents/antora

이제 이 둘을 결합하려고 합니다.

나는 다음을 시도했습니다 :

$ echo $(echo **/.git):h 
demo-component-a/.git demo-component-b/.git:h

이것은 내가 원하는 것이 아닙니다. 여기서 무엇을 할 수 있나요?

답변1

**/.git(:h)

이것h 기록 수정자각 경로 이름에서 파일 이름 부분을 제거합니다. 와일드카드 확장 결과에 기록 수정자를 사용하려면글로벌 예선: 끝 부분의 괄호 안에 선행 문자가 있는 것은 :역사적 수식어임을 의미합니다.

디렉터리만 찾으려면(git에 연결된 작업 트리 제외) (/:h)glob 한정자를 사용하세요.

발견한 대로 이 기록 수정자는 매개변수 확장(예: 함수 소스) :h에도 적용될 수 있습니다 . csh에서는 다음과 같이 명령 대체 분할로 인한 각 단어 zsh에 적용할 수도 있습니다 .$IFS

print -rC1 -- ${$(echo **/.git):h}

그러나 위의 내용은 다른 이유로 인해 틀릴 수 있습니다(예: 를 사용하거나 echoSPC+TAB+NL+NULL에서 파일 경로를 분할함). 와 동일 **/*.git(:h)하면 다음과 같습니다.

print -rC1 -- ${(0)"$(print -rNC1 -- **/*.git)"}

관련 정보