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

Lia*_*iam 19 unix bash shell gzip

我有一个shell脚本,如果文件是压缩的(以.gz结尾),我需要执行一个命令,如果不是,则需要执行另一个命令.我不确定如何处理这个,这里是我正在寻找的概述:

file=/path/name*

if [ CHECK FOR .gz ]
then echo "this file is zipped"
else echo "this file is not zipped"
fi
Run Code Online (Sandbox Code Playgroud)

ric*_*ici 41

你可以使用一个简单的正则表达式,=~[[...]]测试中使用运算符:

if [[ $file =~ \.gz$ ]];
Run Code Online (Sandbox Code Playgroud)

如果扩展名是.tgz,如果你关心的话,这将不会给你正确的答案.但它很容易修复:

if [[ $file =~ \.t?gz$ ]];
Run Code Online (Sandbox Code Playgroud)

正则表达式周围没有引号是必要且重要的.你可以引用,$file但没有意义.

使用该file实用程序可能会更好:

$ file --mime-type something.gz
something.gz: application/x-gzip
Run Code Online (Sandbox Code Playgroud)

就像是:

if file --mime-type "$file" | grep -q gzip$; then
  echo "$file is gzipped"
else
  echo "$file is not gzipped"
fi
Run Code Online (Sandbox Code Playgroud)

  • 在`bash`中,你也可以用`if [[$ file =*.gz]]来代替正则表达式匹配. (5认同)

jth*_*ill 28

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

case "$f" in
*.gz | *.tgz ) 
        # it's gzipped
        ;;
*)
        # it's not
        ;;
esac
Run Code Online (Sandbox Code Playgroud)


Rah*_*thi 11

你可以尝试这样的事情: -

if [[ ${file: -3} == ".gz" ]]
Run Code Online (Sandbox Code Playgroud)

  • 您还可以使用`$ {file ##*.} = gz`,它可以在任何符合POSIX标准的shell中使用. (3认同)