在bash中检查文件扩展名的最简单方法?

在bash中检查文件扩展名的最简单方法?,bash,shell,unix,gzip,Bash,Shell,Unix,Gzip,我有一个shell脚本,如果文件被压缩(以.gz结尾),我需要执行一个命令,如果文件没有压缩,我需要执行另一个命令。我真的不确定如何实现这一点,以下是我要寻找的东西的概要: file=/path/name* if [ CHECK FOR .gz ] then echo "this file is zipped" else echo "this file is not zipped" fi 您可以尝试以下方法:- if [[ ${file: -3} == ".gz" ]] 您可以使用一个简单

我有一个shell脚本,如果文件被压缩(以.gz结尾),我需要执行一个命令,如果文件没有压缩,我需要执行另一个命令。我真的不确定如何实现这一点,以下是我要寻找的东西的概要:

file=/path/name*

if [ CHECK FOR .gz ]
then echo "this file is zipped"
else echo "this file is not zipped"
fi

您可以尝试以下方法:-

if [[ ${file: -3} == ".gz" ]]

您可以使用一个简单的正则表达式,在一个
[…]
测试中使用
=~
操作符来实现这一点:

if [[ $file =~ \.gz$ ]];
如果您关心扩展名是
.tgz
,那么这不会给您正确的答案。但它很容易修复:

if [[ $file =~ \.t?gz$ ]];
正则表达式周围没有引号是必要的,也是重要的。你可以引用
$file
,但没有意义

最好使用
文件
实用程序:

$ file --mime-type something.gz
something.gz: application/x-gzip
比如:

if file --mime-type "$file" | grep -q gzip$; then
  echo "$file is gzipped"
else
  echo "$file is not gzipped"
fi

实际上,在shell脚本中匹配这样的模式的最清晰且通常最简单的方法是使用
case

case "$f" in
*.gz | *.tgz ) 
        # it's gzipped
        ;;
*)
        # it's not
        ;;
esac

zip!=gzip
,应该是“此文件(未)gzip”。正确的方法是使用file。您应该使用
[[
或引用
${file:-3}
;否则如果
$file
有一个空格作为最后一个字符,或者(可能)它将中断在最后三个字符中包含一个glob元字符。@rici:-谢谢你的建议。还更新了我的答案!!:)你也可以使用
${file###*。}=gz
,它将在任何兼容POSIX的shell中工作。@chepner:除非文件名是“gz”,在这种情况下,你可能会得到一个误报。(如果文件名中有空格,您应该引用扩展名。)我想指出冒号后面的空格很重要。
${var:-3}
${var:-3}
不同;如果var未设置,第一个(没有空格)将扩展为“-3”;第二个(有空格)返回变量的最后3个字符。在
bash
中,如果[[$file=*.gz]]代替正则表达式匹配。@chepner,没错,但我想提供匹配
.gz
.tgz
的模式。不可否认,您的模式略短。不过,我认为
文件
解决方案是更好的选择。是的,您是对的。这是最干净的IMHO。实际上,我最喜欢这一个.这是迄今为止最干净的。