将多个目录压缩为单个zip文件的命令


40

我有一个目录,其中包含数十个目录。

我是命令行的新手,我正努力提出一个将每个子目录压缩成唯一的sub-directory.zip文件的命令。

因此最后,我的主目录将充满所有原始子目录,以及.zip包含每个子目录压缩内容的相应文件。

这样的事情可能吗?如果是这样,请告诉我如何完成。


我建议您查找如何在shell中完成“ for循环”。有些在线用户可以做您想做的事,但是一个不错的循环会更加清晰。
lynxlynxlynx

那是否意味着我需要编写一个单独的Shell脚本,然后从命令行调用该脚本?对不起这个基本问题。尽管我确实有一定的编程经验,但是这些东西对我来说还是新的。
Evster

Answers:


75

您可以在中使用此循环bash

for i in */; do zip -r "${i%/}.zip" "$i"; done

i是循环变量的名称。*/表示当前目录的每个子目录,并在这些名称中包含一个斜杠。cd执行此操作之前,请确保您位于正确的位置。"$i"只需命名该目录(包括斜杠)即可。引号确保目录名称中的空格不会引起麻烦。${i%/}就像,$i但是删除了斜杠,因此您可以使用它来构建zip文件的名称。

如果要查看其工作原理,请在echo前面加上,zip然后将看到打印的命令,而不是执行的命令。


谢谢,这看起来很棒!但是,我想到了一个潜在的问题:将每个子目录中的所有目录压缩为单独的文件吗?我只想将1级子目录压缩为单个压缩文件。我不想为第二级,第三级子目录等创建其他zip文件。请让我知道是否有意义。再次感谢!
Evster

只有您要求的第一级。
lynxlynxlynx

*/每一个子目录直接,不是每一个后裔目录名。因此,您只会以最想要的方式获得最上层的zip。其中带有的版本echo将演示该方面。将每个嵌套目录压缩到其自己的文件中实际上将是更多的工作,并且可能使用find -type d其他技巧可以最好地解决。
MvG

1
@fritzmg:在我的Linux上进行的本地测试表明,可以,包括以点开头的文件。这将是Info-ZIP工具的属性,而不是我给的命令的属性,因此根据zip二进制文件的不同,您可能会得到不同的行为。为了也为顶级目录(即当前目录的子目录)创建以点开头的zip文件,您还可以使用shopt -s dotglobglob模式匹配隐藏文件。
MvG

1
要创建一个没有父目录作为根目录的zip:for i in */; do (cd "$i"; zip -r "../${i%/}.zip" .); done
chris
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.