File 如何确定文件名在Unix中是否有扩展名?

File 如何确定文件名在Unix中是否有扩展名?,file,unix,sh,file-extension,File,Unix,Sh,File Extension,我需要找出文件或目录名在Unix中是否包含Bourne shell脚本的任何扩展名 逻辑将是: 如果有文件扩展名 拆下延长件 并使用不带扩展名的文件名 这是我的第一个问题,所以很高兴听到有人问我 扩展的概念并不像传统的/dos8+3文件名那样严格定义。如果要查找包含点(该点不是第一个字符)的文件名,请尝试以下操作 case $filename in [!.]*.*) filename=${filename%.*};; esac 这将从$filename中修剪扩展名(根据上述定义,如果有

我需要找出文件或目录名在Unix中是否包含Bourne shell脚本的任何扩展名

逻辑将是:

  • 如果有文件扩展名
  • 拆下延长件
  • 并使用不带扩展名的文件名

  • 这是我的第一个问题,所以很高兴听到有人问我

    扩展的概念并不像传统的/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表示不分叉!