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

Sen*_*ran 2 shell bash zip wildcards

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

a.zip b.zip c.zip
Run Code Online (Sandbox Code Playgroud)

和/或

z.jar x.jar y.jar
Run Code Online (Sandbox Code Playgroud)

连同其他内容。

我想把它们全部解压缩。

我试过

unzip -q *.zip
Run Code Online (Sandbox Code Playgroud)

unzip -q *.jar
Run Code Online (Sandbox Code Playgroud)

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

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

No zipfiles found.
Run Code Online (Sandbox Code Playgroud)

这对我来说是有问题的,因为这是我的脚本退出的错误。我想默默地解压缩 *.zip 和 *.jar 没有错误。有没有办法做到这一点?

Chr*_*own 6

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

$ shopt -s nullglob
$ tee foo.zip bar.zip </dev/null
$ echo *.zip *.jar
bar.zip foo.zip
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

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

在 POSIX shell 中,也可以像这样完成类似的操作:

for file in *.zip *.jar; do
    if [ "$file" != "*.zip" ] && [ "$file" != "*.jar" ]; then
        unzip -q "$file"
    fi
done
Run Code Online (Sandbox Code Playgroud)