【问题标题】:Easiest way to check for file extension in bash? [duplicate]在 bash 中检查文件扩展名的最简单方法是什么? [复制]
【发布时间】:2013-08-19 04:40:57
【问题描述】:

我有一个 shell 脚本,如果文件被压缩(以 .gz 结尾),我需要执行一个命令,如果不是,则执行另一个命令。我不太确定如何解决这个问题,这是我正在寻找的大纲:

file=/path/name*

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

【问题讨论】:

  • zip != gzip,应该是“这个文件是(不是)gzipped”
  • 正确的方法是使用文件。

标签: bash shell unix gzip


【解决方案1】:

您可以通过一个简单的正则表达式来做到这一点,在 [[...]] 测试中使用 =~ 运算符:

if [[ $file =~ \.gz$ ]];

如果扩展名是.tgz,这不会给你正确的答案,如果你关心的话。但很容易解决:

if [[ $file =~ \.t?gz$ ]];

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

使用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

【讨论】:

  • bash中,也可以使用if [[ $file = *.gz ]]代替正则表达式匹配。
  • @chepner,确实如此,但我想提供与.gz.tgz 匹配的模式。诚然,你的有点短。不过,我认为file 解决方案是更好的选择。
【解决方案2】:

确实,在 shell 脚本中匹配此类模式的最清晰且通常最简单的方法是使用 case

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

【讨论】:

  • 是的,你是对的。这是最干净的恕我直言。
  • 其实我最喜欢这个。它是迄今为止最干净的。
【解决方案3】:

你可以试试这样的:-

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

【讨论】:

  • 你应该使用[[或引用${file: -3};否则,如果$file 的倒数第二个字符有空格,或者(可能)在最后三个字符中包含一个全局元字符,它将中断。
  • @rici:-感谢您的建议。也更新了我的答案!! :)
  • 您也可以使用${file##*.} = gz,它可以在任何符合 POSIX 的 shell 中工作。
  • @chepner:除非文件名是“gz”,否则你会得到(可能)误报。 (如果文件名中有空格,您应该引用扩展名。)
  • 我想指出冒号后面的空格很重要。 ${var:-3}${var: -3}不一样;如果未设置 var,第一个(不带空格)将扩展为 '-3' 第二个(带空格)返回 var 的最后 3 个字符。
猜你喜欢
  • 2015-03-04
  • 2013-01-08
  • 2013-12-22
  • 1970-01-01
  • 2014-04-19
  • 1970-01-01
  • 2010-10-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多