Bash에서 dirname의 마지막 부분을 얻는 방법


81

파일 /from/here/to/there.txt이 있고 dirname to대신 dirname의 마지막 부분 만 가져 오려면 /from/here/to어떻게해야합니까?

답변:


120

basename파일이 아니더라도 사용할 수 있습니다 . dirname를 사용 하여 파일 이름을 제거한 다음을 사용 basename하여 문자열의 마지막 요소를 가져옵니다.

dir="/from/here/to/there.txt"
dir="$(dirname $dir)"   # Returns "/from/here/to"
dir="$(basename $dir)"  # Returns just "to"

2
'$ dir = "$ (dirname $ dir)"'명령은 나를 위해 작동하지 않지만 'dir = "$ (dirname $ dir)"'은 잘 작동합니다.
Nikolai Saiko 2015 년

2
내가 dir그것을 설정할 때 앞에 달러가 있어서는 안되었다.
David W.


23

bash문자열 함수 사용 :

$ s="/from/here/to/there.txt"
$ s="${s%/*}" && echo "${s##*/}"
to

9

Bash 매개 변수 확장을 사용하면 다음 과 같이 할 수 있습니다.

path="/from/here/to/there.txt"
dir="${path%/*}"       # sets dir      to '/from/here/to' (equivalent of dirname)
last_dir="${dir##*/}"  # sets last_dir to 'to' (equivalent of basename)

외부 명령이 사용되지 않으므로 더 효율적입니다.


방금 테스트했습니다. FreeBSD에서 내 결과는 다음과 같습니다. 코드 : #! / bin / sh cd / var / svn / repos path = "$ 1"echo "$ {path}"dir = "$ {path % / *}"echo "$ {dir } "actual ="$ {dir ## * /} "echo"$ {actual} "----------------------------- ----------- 결과 : $ ./makerepo.sh / var / test / var / test / var var $ ------------------- ----------------- 불합격! 죄송합니다. 좋은 방법으로 보이지만 정답은 아닙니다.
Richard Robertson

4

순수한 BASH 방법 :

s="/from/here/to/there.txt"
[[ "$s" =~ ([^/]+)/[^/]+$ ]] && echo "${BASH_REMATCH[1]}"
to

2
파일에 점이 없으면 작동하지 않습니다 .. 디렉토리에 점이 있으면 작동하지 않습니다 .. 단순하게 유지하고 /구분자로 슬래시 를 사용하십시오 .
alvits 2014

1
정말 감사합니다 @Akshay
anubhava

3

awk이를 수행 하는 방법은 다음과 같습니다.

awk -F'/' '{print $(NF-1)}' <<< "/from/here/to/there.txt"

설명:

  • -F'/' 필드 구분 기호를 "/"로 설정합니다.
  • 두 번째 마지막 필드 인쇄 $(NF-1)
  • <<<그 이후의 모든 것을 표준 입력으로 사용합니다 ( wiki 설명 )


1

이 질문은 THIS 와 비슷 합니다.

이를 해결하기 위해 다음을 수행 할 수 있습니다.

DirPath="/from/here/to/there.txt"
DirPath="$(dirname $DirPath)"
DirPath="$(basename $DirPath)"

echo "$DirPath"

내 친구가 말했듯이 이것이 가능합니다.

basename `dirname "/from/here/to/there.txt"`

경로의 일부를 얻으려면 다음을 수행 할 수 있습니다.

echo "/from/here/to/there.txt" | awk -F/ '{ print $2 }'
OR
echo "/from/here/to/there.txt" | awk -F/ '{ print $3 }'
OR
etc

1

질문에 대한 최고의 답변은 절대적으로 정확합니다. 긴 경로 중간에 필요한 디렉토리가있는보다 일반적인 경우이 접근 방식은 코드를 읽기 어렵게 만듭니다. 예 :

dir="/very/long/path/where/THIS/needs/to/be/extracted/text.txt"
dir="$(dirname $dir)"
dir="$(dirname $dir)"
dir="$(dirname $dir)"
dir="$(dirname $dir)"
dir="$(dirname $dir)"
dir="$(basename $dir)"

이 경우 다음을 사용할 수 있습니다.

IFS=/; set -- "/very/long/path/where/THIS/needs/to/be/extracted/text.txt"; set $1; echo $6
THIS
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.