协慌网

登录 贡献 社区

在 Bash 中提取文件名和扩展名

我想分别获取文件名(没有扩展名)和扩展名。

我到目前为止找到的最佳解决方案是:

NAME=`echo "$FILE" | cut -d'.' -f1`
EXTENSION=`echo "$FILE" | cut -d'.' -f2`

这是错误的,因为如果文件名包含多个,则它不起作用.字符。如果,比方说,我有abjs ,它将考虑ab.js ,而不是abjs

它可以在 Python 中轻松完成

file, ext = os.path.splitext(path)

但是如果可能的话,我宁愿不为此启动 Python 解释器。

还有更好的想法?

答案

首先,获取没有路径的文件名:

filename=$(basename -- "$fullfile")
extension="${filename##*.}"
filename="${filename%.*}"

或者,您可以专注于路径的最后一个 '/' 而不是 '。' 即使你有不可预测的文件扩展名,它应该工作:

filename="${fullfile##*/}"
~% FILE="example.tar.gz"
~% echo "${FILE%%.*}"
example
~% echo "${FILE%.*}"
example.tar
~% echo "${FILE#*.}"
tar.gz
~% echo "${FILE##*.}"
gz

有关更多详细信息,请参阅 Bash 手册中的shell 参数扩展

通常您已经知道扩展名,因此您可能希望使用:

basename filename .extension

例如:

basename /path/to/dir/filename.txt .txt

我们得到了

filename