我正在尝试编写一个解压缩当前目录中所有文件的脚本,如下所示。
简单循环展开*.zip
,并解压缩每个f
。
for f in *.zip
do
unzip -o $f
done
但是,当*.zip
模式为空时,即当前目录中没有zip文件时,我收到错误:
unzip: cannot find or open *.zip, *.zip.zip or *.zip.ZIP.
我不明白为什么bash在空的情况下以不同的方式处理模式。在我看来,模式*.zip
在空时被视为字符串文字,在非空时被视为适当的模式。
我的问题是,如何修复脚本以便它也处理空模式?
谢谢,
答案 0 :(得分:3)
最简单的方法是shopt -s nullglob
。如果没有找到文件,那么bash会将*.foo
扩展为空。但是,shell选项是一种基础,所以另一种方法是检查该值是否实际上是一个文件:
#!/bin/sh
for f in *.zip; do
[ -f "$f" ] && unzip -o "$f"
done
答案 1 :(得分:1)
当您键入一个不匹配任何内容的通配符模式的命令时,bash和类似的shell通常会保留未扩展的通配符,并始终运行该命令。它是您通过shell编程学会期待的其中一个问题。
for f in *.zip
do
test -f "$f" && unzip -o "$f"
done
仅当文件确实存在并且是文件时才解压缩文件。它还具有跳过意外匹配模式的目录的好处。
答案 2 :(得分:0)
我这样做:
find . -maxdepth 1 -name '*.zip' -execdir unzip -o {} +