경로에서 디렉토리 추출


123

내 스크립트에는 작업중인 파일 의 디렉토리 가 필요합니다 . 예를 들어 파일 = "stuff / backup / file.zip" . 변수에서 " stuff / backup / " 문자열을 가져 오는 방법이 필요 합니다 $file.

답변:


203
dirname $file

당신이 찾고있는 것입니다


+1, 이길 수 있습니다. 더 빠르지 만 더 많은 것을 입력하도록 촉구되었습니다dirname $file
matchew

1
dirname "$file", 오히려. 따옴표가 없으면 파일 또는 디렉토리 이름에 공백이 있으면 오작동합니다.
Charles Duffy

fml, 질문은 파일에서 절대 디렉토리를 추출해야합니다. 어떻게해야합니까? dirname이 내가 추측 상대 경로를 산출
알렉산더 밀스에게

이것이 win Batch 스크립트에서 수행하는 것이 얼마나 어려운지 놀랍습니다.이를 사용하지 않는 또 다른 이유라고 생각합니다!
벙커 다이브

47
dirname $file

출력됩니다

stuff/backup

다음과 반대입니다 basename.

basename $file

출력 할 것이다

file.zip

나는 :) 매트가 (사람이 dirname)에서 그것을 알아낼 수있을 것이라고 생각
마티유

1
나는 우리 모두가 여기에 매트라고 생각한다. 그냥 추측입니다. 하지만 나는 당신의 대답과 내 대답을 구별하려고 노력했습니다. =)
matchew 2011 년

예, 저는 basename도 많이 사용합니다. 매우 멋집니다 =)하지만 Google에서 파일의 디렉토리를 반환하는 것에 대해 아무것도 찾을 수 없었습니다! 올바른 단어를 찾지 못한 것 같습니다. 하, 우리 3 명 모두 맷의? : D
Matt

1
이러한 명령이 공백 (glob 문자 등)이 포함 된 이름으로 작동하도록하려면 필요한 따옴표를 추가하는 것이 좋습니다.
Charles Duffy

3

${file%/*}Urvin / LuFFy가 제안한 것과 같이 사용 하면 외부 명령에 의존하지 않기 때문에 기술적으로 더 좋습니다. 같은 방법으로 basename을 얻으려면 할 수 있습니다 ${file##*/}. 필요한 경우가 아니면 외부 명령을 사용할 필요가 없습니다.

file="/stuff/backup/file.zip"
filename=${1##*/}     # file.zip
directory=${1%/*}     # /stuff/backup

또한 이러한 방식으로 완전히 POSIX를 준수합니다. 도움이 되었기를 바랍니다. :-)


1
경우 dirname당신이 당신의 경로로 시작하는 완전한되는지 확실하지 않은 경우 내장 된 접근 방식 (효율적)에 비해 장점이있다, 그리고 그의. 당신이 가지고 있다면 file=file.zip, dirname "$file"는 반환 .하지만는 ${file%/*}반환 file.zip합니다.
Charles Duffy

1
... 물론 분기 할 수 있습니다 : case $file in */*) dir=${file%/*};; *) dir=.;; esac여전히 POSIX-y이며 문제를 해결합니다.
Charles Duffy

2

directorypath에서 가져 오기 filepath:

file="stuff/backup/file.zip"
dirPath=${file%/*}/
echo ${dirPath}

1

간단히 사용 $ dirname /home/~username/stuff/backup/file.zip

돌아올 것이다 /home/~username/stuff/backup/

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.