shell循环可以解压缩目录中的所有文件吗?

时间:2010-04-25 16:41:33

标签: shell directory loops unzip

我看过循环来解压缩目录中的所有zip文件。但是,在我运行之前,我宁愿确保我要运行的内容能正常工作:

for i in dir; do cd $i; unzip '*.zip'; rm -rf *.zip; cd ..; done

基本上我希望它看看“dir”的输出看到所有文件夹,对于每个目录cd进入它,解压缩所有zip档案,然后删除它们,然后cd回来再做一次,直到没有更多

这是我应该在一个命令中执行的操作还是应该考虑在Perl中执行此操作?

5 个答案:

答案 0 :(得分:2)

一般来说,你应该没事。对于调试,只需在echo循环中为所有命令添加前缀,即可告诉您变量如何扩展。您也可以随时使用rm -i,而不是rm使用-f进行任何操作。

unzip来电中的单引号只会解压缩名为*.zip的文件,即*不会展开。改为使用双引号(或根本不使用引号)。

您的循环现在假定所有目录$i都直接位于当前目录下。更通用的解决方案是使用目录堆栈(pushdpopd);

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之前,请备份你的目录。