Linux 如何将多个文件夹压缩到各自的zip存档中?

Linux 如何将多个文件夹压缩到各自的zip存档中?,linux,bash,command-line,terminal,Linux,Bash,Command Line,Terminal,所以我想创建一个脚本,使我能够将每个文件夹压缩到它自己的zip文件中 存档,而不是放在一个大的zip文件中 例如,我有一个目录: + MyDirectory/ | | | + Folder_01/ | | | + Folder_02/ | | | + Folder_03/ | 当我在MyDirectory下运行完脚本后,我将拥有MyDirectory中每个文件夹的zip文件:文件夹\u 01.zip,文件夹\u 02.zip和文件夹\u 03.zip。 我知道一些狂欢,但这是我搞不懂的 如何做

所以我想创建一个脚本,使我能够将每个文件夹压缩到它自己的zip文件中 存档,而不是放在一个大的zip文件中

例如,我有一个目录:

+ MyDirectory/
| |
| + Folder_01/
| |
| + Folder_02/
| |
| + Folder_03/
|
当我在
MyDirectory
下运行完脚本后,我将拥有
MyDirectory
中每个文件夹的zip文件:
文件夹\u 01.zip
文件夹\u 02.zip
文件夹\u 03.zip
。 我知道一些狂欢,但这是我搞不懂的

如何做到这一点

亲切的问候

for i in *
do
[ -d "$i" ] && zip -r "$i.zip" "$i"
done
您遍历所有目录并为每个目录创建zip

或者更简洁地说:

for i in */; do zip -r "${i%/}.zip" "$i"; done
(感谢damienfrancois的建议)。

如果需要较小的输出(以较长的过程为代价),请考虑使用算法:

此代码将清理文件夹名称,并为当前目录中的每个文件夹生成
.tar.xz

此处

for i in */; do tar -czvf "${i%/}.tar.gz" "$i"; done

我采用了旧的解决方案,然后又使用了另一个很好的解决方案,它适用于您驱动器中任何位置的任何目录

这是Bash中的代码

#!/bin/bash

folderPath=/home/ahmed/test/

for folder in $folderPath*
do
        folderName=$(basename $folder)
        cd $folderPath && zip -r $folderName.zip $folderName
done

所以test文件夹中的所有文件夹都将压缩到同一个文件夹中

那么到目前为止您尝试了什么?嗨@EdHeal,我知道我需要使用变量对循环进行一些奇怪的bash,当涉及到bash中的变量和循环时,我被卡住了。但我终于找到了我问题的答案。我想我会将代码保存到一个可执行文件中,并将其存储在bin/folder下,因为我认为bash这样的脚本很容易混淆。您可以避免在*/@damienfrancois:Superhint中使用
[-d“$I”]&&
部分
for I!非常感谢。尽管在这种情况下,您必须在之后使用
${i%/}.zip来摆脱拖尾
/
,谢谢!如果将此设置为可执行文件以存储在bin/目录下,并有助于执行压缩操作,您可以为目录提供选项,如
*/
,或为文件提供选项,或者如果您只想压缩.jpeg文件,甚至提供选项。您将如何编写代码,以便只需键入f.ex<编码>压缩*/
,还是
压缩*.jpeg
?更进一步说,可以编写脚本,这样您就可以提供选项,如
-a/--all
,用于将所有内容压缩到一个大的zip存档中,以及
-e/--each
用于将每个内容压缩到自己的zip文件中,等等。。。谢谢!:)@达米安·弗朗索瓦-伟大的一行:
为i in*/;执行zip-r“${i%/}.zip”“$i”;完成
当我在windows 10中的mobaxterm v11(安装zip实用程序后)上测试时,它可以工作。非常感谢。您可能需要添加一个注释,即
-e
显著增加了压缩时间,并且应该或多或少只用于存档。
#!/bin/bash

folderPath=/home/ahmed/test/

for folder in $folderPath*
do
        folderName=$(basename $folder)
        cd $folderPath && zip -r $folderName.zip $folderName
done