注意这里,.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