(알 수 없는) 확장자를 제외한 경로 이름의 파일 이름

(알 수 없는) 확장자를 제외한 경로 이름의 파일 이름

하나 있다경로명추출할 수 있다파일 이름, 제외선험적으로알려진 확장자기본 이름:

$ pathname="/home/paulo/paulo.pdf"
$ printf "%s\n" "$(basename $pathname .pdf)"
paulo

그런데 확장자를 모르면 어떻게 합니까?

답변1

zsh셸 에서 :

$ pathname=/home/paulo/paulo.pdf
$ printf '%s\n' $pathname:t:r
paulo
  • 수정자 :t("tail")는 마지막 경로 이름 구성 요소를 추출합니다 $pathname(비슷하게 작동함 basename).
  • 수정자 :r(내 추측으로는 "루트")는 파일 이름의 비트를 확장자(있는 경우)까지 추출합니다. 확장자는 파일 이름에서 마지막 점 뒤의 부분입니다. 이는 다음과 같은 것을 얻게 될 것임을 의미합니다 .zshrc.

기타 관련 수정자는 다음과 같습니다.

  • :h("head")는 dirname, 및
  • :e("확장자"), 확장자만 추출합니다.

답변2

당신은 그것을 사용할 수 있습니다쉘 매개변수 확장 수정자:

$ pathname="/home/paulo/paulo.pdf"
$ filename=${pathname##*/}
$ printf "%s\n" "$filename"
paulo.pdf
$ basename=${filename%.*}
$ printf "%s\n" "$basename"
paulo

${pathname##*/}pathname가장 긴 일치 접두사를 뺀 내용으로 확장됩니다 */.전체 경로(사용 가능한 경우) 가장 짧은 접미사 일치 항목을 뺀 ${filename%.*}내용으로 확장됩니다 .filename.*파일 확장자(있는 경우).

이는 점으로 표시된 파일 이름의 마지막 부분만 제거하므로 , no paulo.tar.gz가 됩니다 . 엄밀히 말하면 확장자는 다음과 같습니다 (Tarball인 압축 파일입니다. 확장자는 파일을 추출한 후에만 의미가 있습니다).paulo.tarpaulo.gz.tar

확장자가 없는 도트 파일의 경우에도 제대로 작동하지 않습니다.예를 들어 .bashrc아니면 .zshrc; basename가 비어 있게 됩니다. 이는 기본값을 사용하여 처리할 수 있습니다.

$ pathname="/home/paulo/.zshrc"
$ filename=${pathname##*/}
$ printf "%s\n" "$filename"
.zshrc
$ basename=${filename%.*}
$ printf "%s\n" "$basename"

$ printf "%s\n" "${basename:-$filename}"
.zshrc

답변3

이렇게 하면 원하는 작업이 수행됩니다.

pathname="/home/paulo/paulo.pdf"
printf "%s\n" "$(basename $pathname)" | sed "s/\..*$//"

관련 정보