命令将多个目录压缩到单独的 zip 文件中

Evs*_*ter 61 command-line directory zip

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

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

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

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

MvG*_*MvG 108

您可以在bash以下位置使用此循环:

for i in */; do zip -r "${i%/}.zip" "$i"; done
Run Code Online (Sandbox Code Playgroud)

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

如果您想了解它是如何工作的,请在echo之前包含一个zip,您将看到打印的命令而不是执行的命令。

并行执行

要并行运行它们,您可以使用&

for i in */; do zip -0 -r "${i%/}.zip" "$i" & done; wait
Run Code Online (Sandbox Code Playgroud)

我们wait用来告诉 shell 在退出之前等待所有后台任务完成。

请注意,如果当前目录中的文件夹过多,则可能会使计算机不堪重负,因为此代码不限制并行任务的数量。

  • 创建一个没有父目录作为根目录的 zip:`for i in */; 做 (cd "$i"; zip -r "../${i%/}.zip" .); 完成` (4认同)
  • @fritzmg:我的 Linux 上的本地测试表明,是的,包含以点开头的文件。这将是 Info-ZIP 工具的属性,而不是我给出的命令的属性,因此根据您的“zip”二进制文件,您可能会得到不同的行为。为了还为以点开头的顶级目录(即当前目录的子目录)创建 zip 文件,您可以使用 `shopt -s dotglob` 使 glob 模式也匹配隐藏文件。 (2认同)