6

我见过解压缩目录中所有 zip 文件的循环。但是,在我运行它之前,我宁愿确保我将要运行的东西可以正常工作:

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

基本上,我希望它查看“dir”的输出,查看所有文件夹,将每个目录 cd 放入其中,解压缩所有 zip 档案,然后删除它们,然后 cd 回来并再次执行,直到没有更多。

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

4

5 回答 5

2

一般来说,你应该没问题。对于调试,只需在循环中的所有命令前加上前缀即可echo告诉您变量如何扩展。您也可以始终使用rm -i被询问而不是rm继续使用-f.

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

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

for i in $dir; do
  pushd $i
  unzip *.zip
  rm -rf *.zip
  popd
done
于 2010-04-25T16:47:34.013 回答
2

补充一些其他人所说的话:

  • 如果您将参数放在单引号中,例如 in '*.zip',shell 将不会进行通配符扩展,并且 unzip 将尝试处理字面上称为的存档*.zip
  • 如果您只想删除单个文件,请勿-r用作参数。rm这只是不必要的危险,因为可能不打算递归删除子目录。
  • 您应该检查的返回码,unzip只有在解压缩成功时才删除 zip 文件(例如,您可以说if unzip *.zip; then rm *.zip; fi,甚至使用显式for循环来逐个处理 zip 文件)
于 2010-04-25T16:53:35.677 回答
1

用于*获取当前目录的内容:

for i in *; do cd "$i"; ...etc... ; done

在尝试 cd 进入它之前,您还应该确保某物是一个目录。在 bash 中这样做如下:

if [ -d "$i" ]; then ...etc... ; fi

在删除 zip 文件之前,您还应该小心检查解压缩操作是否成功。无需使用递归强制删除来删除单个文件。

我认为这正在推动单行做一个明智的做法的极限。将其放入 shell 脚本并在多行中格式化。

于 2010-04-25T16:46:25.847 回答
1

部分测试:

find . -type d -exec  sh -c "cd \"{}\" ;  unzip \"*.zip\" ; rm \"*.zip\"  "  \;

为每个子目录执行cd//链unziprm

于 2010-04-25T16:51:30.717 回答
0

当你想知道某件事是否可行但又担心它的破坏性后果时,一次做一点:

确保您获得正确的文件:

for i in dir; do cd $i; echo $i; cd ..; done

确保在删除文件之前可以解压缩文件:

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

而且,在您完成全部内容之前,请备份您的目录。

于 2010-04-25T22:50:36.923 回答