답변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.tar
paulo
.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/\..*$//"