我想分别获得文件名(不含扩展名)和扩展名。
到目前为止,我找到的最佳解决方案是。
NAME=`echo "$FILE" | cut -d'.' -f1`
EXTENSION=`echo "$FILE" | cut -d'.' -f2`
这是不对的,因为如果文件名包含多个". "字符,它就不起作用。比方说,如果我有a.b.js
,它将考虑a
和b.js
,而不是a.b
和js
。
在Python中,可以用以下方法轻松完成
file, ext = os.path.splitext(path)
但如果可能的话,我希望不要为了这个而启动Python解释器。
有什么更好的主意吗?
首先,获得不含路径的文件名。
filename=$(basename -- "$fullfile")
extension="${filename##*.}"
filename="${filename%.*}"
另外,你可以关注路径的最后一个'/',而不是'.',即使你有不可预知的文件扩展名,这也应该是可行的。
filename="${fullfile##*/}"
你可能想检查一下文档。
pax> echo a.b.js | sed 's/\.[^.]*$//'
a.b
pax> echo a.b.js | sed 's/^.*\.//'
js
运作良好,所以你可以直接使用。
pax> FILE=a.b.js
pax> NAME=$(echo "$FILE" | sed 's/\.[^.]*$//')
pax> EXTENSION=$(echo "$FILE" | sed 's/^.*\.//')
pax> echo $NAME
a.b
pax> echo $EXTENSION
js
顺便说一下,这些命令的工作原理如下。
NAME
的命令将一个"."
字符后面的任何数量的非"."
字符替换为空字符(即删除从最后的"."
到行末的所有字符,包括在内)。这基本上是一个使用重码技巧的非贪婪的替换。
EXTENSION "的命令是将行首的任意数量的"."
字符替换为空字符(即删除从行首到最后的点的所有内容,包括)。这是一个贪婪的替换,是默认动作。