解压两种不同类型的文件扩展名

解压两种不同类型的文件扩展名

注意这里,.zip和.jar只是一个例子,我的文件扩展名是不同的。假设我有一个可以包含多个 zip 文件的目录

a.zip b.zip c.zip

和/或

z.jar x.jar y.jar

以及其他内容。

我想把它们全部解压。

我试过

unzip -q *.zip

unzip -q *.jar

但是当文件夹不包含.jar文件时,第二个命令将失败

unzip:  cannot find or open *.jar, *.jar.zip or *.jar.ZIP.

No zipfiles found.

这对我来说是有问题的,因为我的脚本会退出错误。我想默默地解压 *.zip 和 *.jar 而不会出现错误。有办法实现这个吗?

答案1

是的,你可以nullglob在 bash 中使用:

$ shopt -s nullglob
$ tee foo.zip bar.zip </dev/null
$ echo *.zip *.jar
bar.zip foo.zip

nullglob选项将不匹配的 glob 的行为从变成文字字符串更改为完全删除。

但是,这可能不足以满足您的特定用例,因为unzip如果不传递任何参数,则不知道该怎么做。您应该先检查是否有要解压的 zip/jar,如下所示:

shopt -s nullglob
zips=( *.zip )
jars=( *.jar )
(( "${#zips[@]}" )) && unzip -q "${zips[@]}"
(( "${#jars[@]}" )) && unzip -q "${jars[@]}"

或一次全部(如果适用):

shopt -s nullglob
zipsandjars=( *.zip *.jar )
(( "${#zipsandjars[@]}" )) && unzip -q "${zipsandjars[@]}"

在 POSIX shell 中也可以执行类似的操作:

for file in *.zip *.jar; do
    if [ "$file" != "*.zip" ] && [ "$file" != "*.jar" ]; then
        unzip -q "$file"
    fi
done

相关内容