Bash의 파일 경로 인수에서 마지막 dirname / filename 가져 오기


228

개발 서버에서 호스팅되는 SVN에 대한 커밋 후 후크를 작성하려고합니다. 내 목표는 커밋 된 프로젝트의 사본을 서버에서 호스팅되는 디렉토리로 자동 체크 아웃하는 것입니다. 그러나 프로젝트가 호스팅되는 동일한 하위 디렉토리로 체크 아웃하려면 스크립트에 전달 된 디렉토리 문자열의 마지막 디렉토리 만 읽을 수 있어야합니다.

예를 들어 프로젝트 "example"에 대해 SVN 커밋을 수행하면 내 스크립트는 "/ usr / local / svn / repos / example"을 첫 번째 인수로 가져옵니다. 문자열의 끝에서 "example"을 가져온 다음 다른 문자열과 연결하여 "/ server / root / example"에 체크 아웃하고 변경 사항이 즉시 적용되도록해야합니다.

답변:


344

basename 경로의 디렉토리 접두사를 제거합니다.

$ basename /usr/local/svn/repos/example
example
$ echo "/server/root/$(basename /usr/local/svn/repos/example)"
/server/root/example

2
basename은 확실히 내가 찾고있는 것입니다. 그래도 인수의 기본 이름을 변수에 저장하려면 어떻게해야합니까? 예 :SUBDIR="/path/to/whatever/$(basename $1)"
TJ L

5
@ tj111 : is no 같 $1거나 $1비어 있음
sth

불행히도, 명령을 줄 바꿈하면 basename은 좋지 않습니다. 명심해야 할 것
dtc

98

다음 접근 방식을 사용하여 경로 이름의 경로를 얻을 수 있습니다.

some_path=a/b/c
echo $(basename $some_path)
echo $(basename $(dirname $some_path))
echo $(basename $(dirname $(dirname $some_path)))

산출:

c
b
a

1
공백이 경로가있는 작품은 ... 당신은 어떻게 든 작동 따옴표 ...와 그것을 극복 할 수 없습니다echo "$(basename "$(dirname "$pathname")")"
레이 포스

75

Bash는 external을 호출하지 않고도 경로의 마지막 부분을 가져올 수 있습니다 basename.

subdir="/path/to/whatever/${1##*/}"

2
내 Mac에서는 하위 문자열 표기법을 사용하는 것이 수천 개의 파일 각각에 사소한 일을하는 경우 dirname / basename보다 훨씬 빠릅니다.
George

1
d=/home/me/somefolder;subdir="/$d/${1##*/}"같은 나는 뭔가 결국 //home/me/somefolder//은 $ d는 실제로 루프에서 유래 for d in $(find $SOMEFOLDER -maxdepth 1 -type d);하여 subdir=$(basename $d)예상대로 작동합니다.
Buttle Butkus

1
@ButtleButkus : 당신은 사용해야 while대신 for의 출력을 반복하는 find( find -print0 | xargs -0더 나은) 또는 사용은 글 로빙 : for d in $SOMEFOLDER/*/(같은 최종 슬래시 작품 -type d- 당신이 사용할 수있는 **당신이 경우 재귀에 대한 배쉬 4 shopt -s globstar하지만, "너무 긴 인수 목록 '메시지가 가능한). 점을 유의 ${1}명령 부 스크립트 또는 함수의 첫번째 인수를 나타낸다. 당신은 사용해야 할 수도 있습니다 ${d##*/}또는 다른 변수 또는 인수 지정 또는 확인 인수가 전달되고 있는지 확인$1
추후 공지가있을 때까지 일시 중지.

2
@DennisWilliamson 감사 에 대한 많은 공유 . 왜 그것이 작동하지 않는지 궁금해하는 미래의 독자들에게 또는 나는 여기에서 멍청한 유일한 사람입니다. 위의 답변에는가 $1포함되어 있다고 가정합니다 the path from which last component is to be taken out. 나는 그 부분을 놓쳤다. 내 사용 사례 : target_path='/home/user/dir1/dir2/dir3/'; target_path="${target_path%/}"; last_component=${target_path##*/}; echo $last_component-Works 😉
Vinay Vissh

2
작동 방식이유 에 대한 설명은 여기를 참조하십시오 ${1##*/}. unix.stackexchange.com/a/171786/15070
Matthew
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.