我想分别获取文件名(不带扩展名)和扩展名。

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

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##*/}"

您可能需要检查文档:

在网页“3.5.3外壳参数扩展”部分在bash手册页的“参数扩展”部分

其他回答

好的,如果我理解正确,这里的问题是如何获取具有多个扩展名的文件的名称和完整扩展名,例如stuff.tar.gz。

这对我有用:

fullfile="stuff.tar.gz"
fileExt=${fullfile#*.}
fileName=${fullfile%*.$fileExt}

这将为您提供文件名和扩展名.tar.gz。它适用于任何数量的扩展,包括0。希望这对有同样问题的人有所帮助=)

$ F = "text file.test.txt"  
$ echo ${F/*./}  
txt  

这可以满足文件名中的多个点和空格,但是如果没有扩展名,则返回文件名本身。但易于检查;只需测试文件名和扩展名是否相同。

自然,此方法不适用于.tar.gz文件。然而,这可以分两步处理。如果扩展名是gz,则再次检查是否也有tar扩展名。

一个简单的bash一行。我用这个从pwd中的所有文件中删除rst扩展名

for each in `ls -1 *.rst`
do
     a=$(echo $each | wc -c)
     echo $each | cut -c -$(( $a-5 )) >> blognames
done

它做什么?

1) ls-1*.rst将在新行中列出stdout上的所有文件(try)。

2) echo$each|wc-c统计每个文件名中的字符数。

3) echo$each|cut-c-$(($a-5))最多选择最后4个字符,即.rst。

您可以强制剪切以显示所有字段和后续字段,并将其添加到字段编号。

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

因此,如果FILE为eth0.pcap.gz,则EXTENSION将为pcap.gz

使用相同的逻辑,您还可以使用“-”和cut获取文件名,如下所示:

NAME=`basename "$FILE" | cut -d'.' -f-1`

这甚至适用于没有任何扩展名的文件名。

我使用以下脚本

$ echo "foo.tar.gz"|rev|cut -d"." -f3-|rev
foo