我见过解压缩目录中所有 zip 文件的循环。但是,在我运行它之前,我宁愿确保我将要运行的东西可以正常工作:
for i in dir; do cd $i; unzip '*.zip'; rm -rf *.zip; cd ..; done
基本上,我希望它查看“dir”的输出,查看所有文件夹,将每个目录 cd 放入其中,解压缩所有 zip 档案,然后删除它们,然后 cd 回来并再次执行,直到没有更多。
这是我应该在单个命令中执行的操作还是应该考虑在 Perl 中执行此操作?
一般来说,你应该没问题。对于调试,只需在循环中的所有命令前加上前缀即可echo
告诉您变量如何扩展。您也可以始终使用rm -i
被询问而不是rm
继续使用-f
.
调用中的单引号unzip
只会解压缩名为 的文件*.zip
,即*
不会扩展。改用双引号(或根本不使用引号)。
您的循环现在假定所有目录$i
都直接在当前目录下。更通用的解决方案是使用目录堆栈(pushd
和popd
);
for i in $dir; do
pushd $i
unzip *.zip
rm -rf *.zip
popd
done
补充一些其他人所说的话:
'*.zip'
,shell 将不会进行通配符扩展,并且 unzip 将尝试处理字面上称为的存档*.zip
-r
用作参数。rm
这只是不必要的危险,因为可能不打算递归删除子目录。unzip
只有在解压缩成功时才删除 zip 文件(例如,您可以说if unzip *.zip; then rm *.zip; fi
,甚至使用显式for
循环来逐个处理 zip 文件)用于*
获取当前目录的内容:
for i in *; do cd "$i"; ...etc... ; done
在尝试 cd 进入它之前,您还应该确保某物是一个目录。在 bash 中这样做如下:
if [ -d "$i" ]; then ...etc... ; fi
在删除 zip 文件之前,您还应该小心检查解压缩操作是否成功。无需使用递归强制删除来删除单个文件。
我认为这正在推动单行做一个明智的做法的极限。将其放入 shell 脚本并在多行中格式化。
部分测试:
find . -type d -exec sh -c "cd \"{}\" ; unzip \"*.zip\" ; rm \"*.zip\" " \;
为每个子目录执行cd
//链unzip
。rm
当你想知道某件事是否可行但又担心它的破坏性后果时,一次做一点:
确保您获得正确的文件:
for i in dir; do cd $i; echo $i; cd ..; done
确保在删除文件之前可以解压缩文件:
for i in dir; do cd $i; unzip '*.zip'; cd ..; done
而且,在您完成全部内容之前,请备份您的目录。