Paulo Tomé Asked: 2020-02-11 04:53:00 +0800 CST2020-02-11 04:53:00 +0800 CST 2020-02-11 04:53:00 +0800 CST 路径名中的文件名,不包括(未知)扩展名 772 有了路径名,就可以提取它的filename,不包括它的先验已知扩展名,basename: $ pathname="/home/paulo/paulo.pdf" $ printf "%s\n" "$(basename $pathname .pdf)" paulo 但是,如果不知道扩展名怎么办? shell filenames 3 个回答 Voted Best Answer Kusalananda 2020-02-11T05:04:08+08:002020-02-11T05:04:08+08:00 在zsh外壳中: $ pathname=/home/paulo/paulo.pdf $ printf '%s\n' $pathname:t:r paulo 修饰符( “ :ttail”)提取最后一个路径名组件$pathname(它的工作方式类似于basename)。 修饰符(我想是:r“root”)将文件名的位提取到扩展名,如果有的话。扩展名是文件名中最后一个点之后出现的部分。这意味着对于像.zshrc. 另一个相关的修饰符是 :h("head"),其工作方式类似于dirname和 :e(“扩展名”),仅提取扩展名。 Stephen Kitt 2020-02-11T04:57:11+08:002020-02-11T04:57:11+08:00 您可以使用shell 的参数扩展修饰符: $ pathname="/home/paulo/paulo.pdf" $ filename=${pathname##*/} $ printf "%s\n" "$filename" paulo.pdf $ basename=${filename%.*} $ printf "%s\n" "$basename" paulo ${pathname##*/}扩展为 的内容pathname,减去最长的前缀匹配*/,即完整路径(如果有的话)。${filename%.*}扩展为 的内容filename,减去匹配的最短后缀.*,即文件的扩展名(如果有的话)。 请注意,这只会删除由点引入的最后一个文件名组件;paulo.tar.gz就这样paulo.tar,不会paulo。严格来说,扩展名是.gz(它是一个压缩文件,恰好是一个 tarball;.tar只有在提取文件后扩展名才真正有意义)。 这对于无扩展名的点文件也无法正常工作,例如 .bashrcor .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 Michael Prokopec 2020-02-11T05:21:32+08:002020-02-11T05:21:32+08:00 这应该做你想要的: pathname="/home/paulo/paulo.pdf" printf "%s\n" "$(basename $pathname)" | sed "s/\..*$//"
在
zsh
外壳中::t
tail”)提取最后一个路径名组件$pathname
(它的工作方式类似于basename
)。:r
“root”)将文件名的位提取到扩展名,如果有的话。扩展名是文件名中最后一个点之后出现的部分。这意味着对于像.zshrc
.另一个相关的修饰符是
:h
("head"),其工作方式类似于dirname
和:e
(“扩展名”),仅提取扩展名。您可以使用shell 的参数扩展修饰符:
${pathname##*/}
扩展为 的内容pathname
,减去最长的前缀匹配*/
,即完整路径(如果有的话)。${filename%.*}
扩展为 的内容filename
,减去匹配的最短后缀.*
,即文件的扩展名(如果有的话)。请注意,这只会删除由点引入的最后一个文件名组件;
paulo.tar.gz
就这样paulo.tar
,不会paulo
。严格来说,扩展名是.gz
(它是一个压缩文件,恰好是一个 tarball;.tar
只有在提取文件后扩展名才真正有意义)。这对于无扩展名的点文件也无法正常工作,例如
.bashrc
or.zshrc
;basename
最终是空的。默认值可用于处理:这应该做你想要的: