有没有办法检查是否包含任何类型的文件扩展名?

时间:2017-03-25 10:05:43

标签: bash shell unix

我知道如何检查文件扩展名,但我要问的是,是否有办法检查用户输入是否包含任何文件扩展名。

例如

./ myscript index.html的文件扩展名为

从技术上讲,我知道我可以使用类似

之类的标准bash检查文件扩展名
FILE="$1"
FILE_EXT=${FILE##.*}

然而问题是,如果我有一个名为file.script.up.exe的文件有多个点,显然它会在file.script上结束我的file_ext,这不是我想要的。

从技术上讲,您可以使用FILE_EXT=$(echo "$FILE" | awk -F . '{print $NF}')

但是当程序在没有文件扩展名的情况下启动时会出现问题

所以基本上我需要的是创建一个if条件来检查脚本是否是使用文件扩展名启动的,并且根据结果,如果条件相应地采取行动

任何想法如何解决这个问题?

3 个答案:

答案 0 :(得分:2)

请改为:

FILE="$1"
FILE_EXT=${FILE##*.}

与代码相比,唯一的变化是星号和点的顺序相反。

##扩展运算符从变量中包含的字符串的开头开始删除模式的最长匹配。它是一种模式,而不是正则表达式,因此*代表任何字符序列,.代表字面时间。结果是,此扩展会删除文件名中的最后一个句点,包括文件名中的最后一个句点。

答案 1 :(得分:0)

在您的情况下,

awk应该像这样使用:在打印最后一个之前检查数字字段。

FILE_EXT=$(echo "$FILE" | awk -F . '{if (NF>1) {print $NF}}')

答案 2 :(得分:0)

如果理解正确,则只需要文件中多个点的最后一个扩展名,例如some.file.ext您需要ext

这通常很简单,但这里也是极端情况。例如,文件.profile没有扩展名但有一个点。就像。

所以,我会使用不那么短的解决方案,也许有人会给你发一个更好的解决方案。

    line="/some/full/path/name.to.file.ext"

    regex='^(.+)\.([^.]+)$'
    dir=$(dirname "$line")
    base=$(basename "$line")
    ext=""
    if [[ "$base" =~ $regex ]]
    then
            fnoex="${BASH_REMATCH[1]}"
            ext="${BASH_REMATCH[2]}"
    else
            fnoex="$base"
    fi
    #here you have 4x variables
    # $dir - directory name
    # $base - the filename
    # $fnoex - filename without the extension
    # $ext - the extension

原则是:

  • 您应首先将path拆分为dirnamefilename
  • 并仅拆分filename(目录名称中的点上的错误匹配)

上述内容应该适用于奇怪的路径和文件名,例如

/we.i.r d/.file    #no ext
.file.ext.         #no ext
./file.ext..ext2   #ext2