나는 이것을 가지고있다:
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 -print0
및 find
with 는 개행으로 구분된 목록 대신 빈으로 구분된 목록으로 경로 이름을 -0
전달합니다 . 이 옵션은 의 입력 없이는 실행되지 않도록 합니다 .xargs
-r
xargs
dirname
find
파일 이름에 개행 문자가 포함되어 있지 않다는 것을 알고 있는 경우:
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
도 포함하도록 요구합니다 . 마지막 것은 일치하는 각 경로 이름에 대해 "헤드"(즉, 파일 이름이 없는 경로 이름의 디렉터리 부분)를 반환합니다.D
dotglob
bash
: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