我有一个 shell 脚本,如果文件是压缩的(以 .gz 结尾),我需要执行一个命令,如果不是,则执行另一个命令。我不太确定如何处理这个问题,以下是我正在寻找的大纲:
file=/path/name*
if [ CHECK FOR .gz ]
then echo "this file is zipped"
else echo "this file is not zipped"
fi
我有一个 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 =~ \.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
解决方案是更好的选择。 - rici实际上,在shell脚本中匹配这种模式的最清晰、最简单的方法通常是使用case
。
case "$f" in
*.gz | *.tgz )
# it's gzipped
;;
*)
# it's not
;;
esac
你可以尝试这样做:
if [[ ${file: -3} == ".gz" ]]
[[
或引用${file: -3}
;否则,如果$file
的倒数第二个字符是空格,或者(可能)在最后三个字符中包含glob元字符,则会出现错误。 - rici${file##*.} = gz
,它适用于任何符合 POSIX 标准的 shell。 - chepner[[ ... ]]
条件表达式中,扩展参数不会发生单词拆分,但是您对命名为 gz
的文件的误报是正确的。 - chepner${var:-3}
和${var: -3}
不同;第一个(没有空格)如果var未设置,则会扩展为“-3”,而第二个(有空格)返回var的最后3个字符。 - pbatey