디렉토리 경로의 마지막 슬래시를 제거하는 방법?


17

하나의 인수로 디렉토리가 필요한 스크립트가 있습니다. 나는 두 가지 형태를 지원하고 싶다 : 하나는 같다

a/b/c

(끝에 슬래시 없음) 다른 하나는

 a/b/c/

(끝에 슬래시가 있음).

내 질문 : 두 양식 중 하나가 주어지면 첫 번째 양식을 변경하지 않고 두 번째 양식의 마지막 슬래시를 제거하여 첫 번째 양식으로 변환하는 방법은 무엇입니까?


2
시작점을 제외한 모든 곳에서 이중 슬래시는 단일 슬래시와 같으므로을 사용하여 조인하는 것에 대해 걱정할 필요가 없습니다 /.
muru

@muru 나는 ​​전에 이것을 몰랐다 :).
Yulong Ao


1
@muru 끝에 슬래시가 있으면 심볼릭 링크에 대한 작업과 해당 디렉토리에 대한 작업 또는의 소스 인수와 같은 차이가 발생할 수 있습니다 rsync.
Gilles 'SO- 악마 중지'

@Gilles는 사실이지만, 보시다시피, 나는 길을 연결하는 것에 대해 이야기하고 있습니다.
muru

답변:


23
dir=${1%/}

스크립트의 첫 번째 매개 변수를 사용하고 후행 슬래시가 있으면 제거합니다.


12

후행 슬래시가 있으면 제거하려면 모든 POSIX 스타일 쉘에 있는 접미사 제거 매개 변수 확장 구문을 사용할 수 있습니다 .

x=${x%/}

몇 가지 합병증이 있습니다. 이것은 단일 슬래시 만 제거하므로 시작 a/b/c//하면 슬래시가 생깁니다. 또한 원래 경로가 /인 경우 슬래시를 유지해야합니다. 다음은 이러한 경우를 처리하는보다 복잡한 솔루션입니다.

case $x in
  *[!/]*/) x=${x%"${x##*[!/]}"};;
  *[/]) x="/";;
esac

또는 ksh 또는 bash에서 다음을 수행하십시오 shopt -s extglob.

[[ x = *[!/] ]] || x=${x%%*(/)}

많은 경우에 슬래시가 있는지는 중요하지 않습니다. 인수가 디렉토리에 대한 심볼릭 링크인지 여부는 중요합니다. 후행 슬래시를 사용하면 인수가 디렉토리를 지정하지만 후행 슬래시가 없으면 인수가 심볼릭 링크 자체를 지정합니다. 또한 몇 가지 다른 프로그램에서 중요합니다. 예를 들어의 소스 인수는 rsync슬래시의 존재 여부에 따라 다르게 처리됩니다.


2

realpath주어진 경로를 해결합니다. 무엇보다도 슬래시를 제거합니다. -s다음 simlink를 방지하기 위해 사용

DIR=/tmp/a///
echo $(realpath -s $DIR)
# output: /tmp/a
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.