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 没有错误。有没有办法做到这一点?
是的,您可以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)