경로에서 디렉토리 추출


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.