我看过循环来解压缩目录中的所有zip文件。但是,在我运行之前,我宁愿确保我要运行的内容能正常工作:
for i in dir; do cd $i; unzip '*.zip'; rm -rf *.zip; cd ..; done
基本上我希望它看看“dir”的输出看到所有文件夹,对于每个目录cd进入它,解压缩所有zip档案,然后删除它们,然后cd回来再做一次,直到没有更多
这是我应该在一个命令中执行的操作还是应该考虑在Perl中执行此操作?
答案 0 :(得分:2)
一般来说,你应该没事。对于调试,只需在echo
循环中为所有命令添加前缀,即可告诉您变量如何扩展。您也可以随时使用rm -i
,而不是rm
使用-f
进行任何操作。
unzip
来电中的单引号只会解压缩名为*.zip
的文件,即*
不会展开。改为使用双引号(或根本不使用引号)。
您的循环现在假定所有目录$i
都直接位于当前目录下。更通用的解决方案是使用目录堆栈(pushd
和popd
);
for i in $dir; do
pushd $i
unzip *.zip
rm -rf *.zip
popd
done
答案 1 :(得分:2)
有几点补充了别人所说的话:
'*.zip'
中,则shell不会进行通配符扩展,解压缩将尝试处理一个名为*.zip
-r
用作rm
的参数。这只是不必要的危险,因为任何递归删除子目录都可能没有意图。unzip
的返回代码,并且只有在解压缩成功时才删除zip文件(例如,您可以说if unzip *.zip; then rm *.zip; fi
,或者甚至使用显式for
循环来处理zip文件一个接一个)答案 2 :(得分:1)
使用*
获取当前目录的内容:
for i in *; do cd "$i"; ...etc... ; done
在尝试cd之前,您还应确保某些内容是目录。在bash中,这可以完成如下:
if [ -d "$i" ]; then ...etc... ; fi
在删除zip文件之前,还应该注意检查解压缩操作是否成功。删除单个文件不需要使用递归强制删除。
我认为这是推动限制一条线的理由。将它放入shell脚本并在多行上格式化。
答案 3 :(得分:1)
部分测试:
find . -type d -exec sh -c "cd \"{}\" ; unzip \"*.zip\" ; rm \"*.zip\" " \;
为每个子目录执行cd
/ unzip
/ rm
链。
答案 4 :(得分:0)
如果你想知道某件事是否有效但是对它的破坏性后果保持警惕,那么一次做一点:
确保您获得正确的文件:
for i in dir; do cd $i; echo $i; cd ..; done
确保在删除文件之前解压缩文件:
for i in dir; do cd $i; unzip '*.zip'; cd ..; done
而且,在你完成monty之前,请备份你的目录。