File 如何确定文件名在Unix中是否有扩展名?
我需要找出文件或目录名在Unix中是否包含Bourne shell脚本的任何扩展名 逻辑将是:File 如何确定文件名在Unix中是否有扩展名?,file,unix,sh,file-extension,File,Unix,Sh,File Extension,我需要找出文件或目录名在Unix中是否包含Bourne shell脚本的任何扩展名 逻辑将是: 如果有文件扩展名 拆下延长件 并使用不带扩展名的文件名 这是我的第一个问题,所以很高兴听到有人问我 扩展的概念并不像传统的/dos8+3文件名那样严格定义。如果要查找包含点(该点不是第一个字符)的文件名,请尝试以下操作 case $filename in [!.]*.*) filename=${filename%.*};; esac 这将从$filename中修剪扩展名(根据上述定义,如果有
这是我的第一个问题,所以很高兴听到有人问我 扩展的概念并不像传统的/dos8+3文件名那样严格定义。如果要查找包含点(该点不是第一个字符)的文件名,请尝试以下操作
case $filename in
[!.]*.*) filename=${filename%.*};;
esac
这将从$filename
中修剪扩展名(根据上述定义,如果有多个扩展名,则从最后一个点开始),如果有扩展名,则不修剪任何扩展名
如果您不处理名称可能以点开头的文件,大小写
是多余的,因为如果没有点,赋值也不会触及该值;但是,以腰带和吊带为例,你可以很容易地选择你喜欢的方法,以防你需要以这样或那样的方式扩展它
若要处理有点的文件,只要它不是第一个字符(但如果第一个字符也是点也可以),请尝试模式?*.
模式)
命令中的大小写表达式;;esac
语法可能看起来很奇怪或吓人,但它非常通用,非常值得学习。我会使用shell不可知的解决方案。通过以下方式运行名称:
cut -d . -f 1
将提供到第一个点的所有信息('-d'设置delimeter,'-f 1'选择第一个字段)。您可以使用params(尝试使用“-complete”来反向选择)并获得您想要的任何东西。目前为止,没有任何其他答案是特定于与Bourne兼容的shell的。或者你的意思是csh/tcsh/随便什么?我温和地建议了一个不在乎的解决方案。是的,csh/tcsh/随便什么。为了让它看起来不那么可怕,你可以使用可选的(
来定义模式:([!.]*.*)
。是的,它是POSIX语法,通过匹配打开和关闭参数来帮助vi
。+1表示不分叉!