我有一个目录,其中包含数十个目录。
我是命令行新手,我正在努力想出一个命令来将每个子目录压缩到一个唯一的 sub-directory.zip 文件中。
所以最后我的主目录将填充我所有的原始子目录,以及.zip
包含每个子目录压缩内容的相应文件。
这样的事情可能吗?如果是这样,请告诉我它是如何完成的。
答案1
您可以在以下位置使用此循环bash
:
for i in */; do zip -r "${i%/}.zip" "$i"; done
i
是循环变量的名称。*/
表示当前目录的每个子目录,并且在这些名称中包含尾部斜杠。在执行此操作之前,请确保您cd
位于正确的位置。"$i"
只需命名该目录,包括尾部斜杠。引号确保目录名称中的空格不会造成麻烦。${i%/}
类似于$i
但删除了尾部斜杠,因此您可以使用它来构造 zip 文件的名称。
如果您想了解其工作原理,请在echo
之前添加zip
,您将看到打印的命令而不是执行的命令。
并行执行
要并行运行它们,您可以使用&
:
for i in */; do zip -0 -r "${i%/}.zip" "$i" & done; wait
我们用来wait
告诉 shell 等待所有后台任务完成后再退出。
请注意,如果当前目录中有太多文件夹,则您的计算机可能会不堪重负,因为此代码不限制并行任务的数量。
答案2
如果您想在 Windows/Batch 上执行此操作,这里有一个我整理的类似脚本。
@ECHO OFF
REM Cycle Through all of the directories in the current folder
for /D %%d in (*) do (
REM Change to the directory
pushd %%d
REM Make the destination directory.
mkdir "Z:\%%d"
REM Cycle Through all Subdirectories
for /D %%b in (*) do (
REM Zip up all subdirectores, and put it in the destination.
7z -r a "Z:\%%d\%%b.zip" %%b
)
popd
)