내 하위 디렉터리에 여러 개의 .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}
그러나 위의 내용은 다른 이유로 인해 틀릴 수 있습니다(예: 를 사용하거나 echo
SPC+TAB+NL+NULL에서 파일 경로를 분할함). 와 동일 **/*.git(:h)
하면 다음과 같습니다.
print -rC1 -- ${(0)"$(print -rNC1 -- **/*.git)"}