경로에서 디렉토리 이름을 얻는 방법

경로에서 디렉토리 이름을 얻는 방법

나는 이것을 가지고있다:

find . -type f -name '*_test.go' | xargs dirname

하지만 나는 다음을 얻습니다.

사용법: 디렉터리 이름 경로

산출

$ find . -type f -name '*_test.go' 

예:

./pkg_test.go
./v3/organization/organization_test.go
./v3/common/pkg_test.go
./v3/model/boil_main_test.go
./v3/model/boil_queries_test.go
./v3/model/advances_test.go
./v3/model/boil_suites_test.go
./v3/model/psql_main_test.go
./v3/model/psql_suites_test.go

파일의 디렉토리 이름을 얻는 방법을 아는 사람이 있습니까? 어쩌면 절대 경로가 필요한가요?

답변1

세 가지 방법:

첫째, 한 번에 여러 경로 이름을 제공하기 xargs때문에 접근 방식이 실패합니다 . dirname대신 경로명을 하나씩 전달하세요.

find . -type f -name '*_test.go' -print0 | xargs -0 -r -I {} dirname {}

with -print0findwith 는 개행으로 구분된 목록 대신 빈으로 구분된 목록으로 경로 이름을 -0전달합니다 . 이 옵션은 의 입력 없이는 실행되지 않도록 합니다 .xargs-rxargsdirnamefind

파일 이름에 개행 문자가 포함되어 있지 않다는 것을 알고 있는 경우:

find . -type f -name '*_test.go' | xargs -r -I {} dirname {}

find둘째, 파일에서 하나씩 실행되는 인라인 셸 스크립트를 호출합니다 .dirname

find . -type f -name '*_test.go' -exec sh -c '
    for pathname do
        dirname "$pathname"
    done' sh {} +

또는 dirname호출하는 대신 루프에서 매개변수 대체를 사용합니다(더 빠름).

find . -type f -name '*_test.go' -exec sh -c '
    for pathname do
        printf "%s\n" "${pathname%/*}"
    done' sh {} +

셋째, GNU를 사용하는 경우 find다음을 사용하십시오 -printf.

find . -type f -name '*_test.go' -printf '%h\n'

마지막으로 다음을 사용하는 경우 zsh:

print -rC1 -- ./**/*_test.go(.ND:h)

glob 수정자는 (.ND:h)이전 globbing 패턴이 일반 파일( )로만 확장되거나 .패턴과 일치하는 파일이 없는 경우 아무것도 확장하지 않고( N, as nullglob) 숨겨진 이름( , as ) bash도 포함하도록 요구합니다 . 마지막 것은 일치하는 각 경로 이름에 대해 "헤드"(즉, 파일 이름이 없는 경로 이름의 디렉터리 부분)를 반환합니다.Ddotglobbash:h

bash다음과 같이 루프에서 동일한 작업을 수행할 수 있습니다.

shopt -s globstar nullglob dotglob

for pathname in ./**/*_test.go; do
    if [[ -f $pathname ]] && [[ ! -h $pathname ]]; then
        printf '%s\n' "${pathname%/*}"
    fi
done

관련 정보