在Linux中,什么是一次递归ZIP多个目录的最佳方法? [重复]


1

这个问题在这里已有答案:

我有一个目录, /dir,它充满了没有通用命名方案的其他目录。所以 /dir/EqcWTG /dir/SomeDirectoryName /dir/3435346 等等。

我想将这些目录中的每一个转换为zip文件。所以基本上我想跑 $ zip -r directoryname.zip directoryname 在每个目录中 $(pwd)

最简单的方法是什么?

Answers:


3

运用 find 这应该工作:

find /dir -not -name "dir" -maxdepth 1 -type d -exec zip -r '{}.zip' '{}' \;

请注意我的方式 /dir 作为主要 find 路径也有 -not -name "dir" 这样父目录就不会被存档。接下来我们限制深度 find 扫描 -maxdepth 1 意思是 find 只会搜索该路径的直接孩子 /dir。之后,我们确保只对目录采取行动 -type d。最后我们使用 -exec 跑神奇的 zip 将以递归方式压缩它找到的所有目录的命令; {} 只等于目录名称本身。

另一个机智是使用 -mindepth 1 代替 -not -name "dir" 以防万一父嵌套目录 /dir 结构也以某种方式命名 /dir 或者将“dir”作为其名称的一部分:

find /dir -mindepth 1 -maxdepth 1 -type d -execdir echo {} \;

现在,这些将创建将扩展到完整的ZIP存档 /dir 路径; /dir/EqcWTG/dir/SomeDirectoryName/dir/3435346等等...如果您想要独立/相对ZIP档案,您可以使用 -execdir 代替 -exec 像这样:

find /dir -not -name "dir" -maxdepth 1 -type d -execdir zip -r '{}.zip' '{}' \;

相同 -execdir 想法,但与 -mindepth 1 代替 -not -name "dir"

find /dir -mindepth 1  -maxdepth 1 -type d -execdir zip -r '{}.zip' '{}' \;

以来 -execdir 迫使 find 命令在它找到的实际目录中执行 - 而不是完整路径 - 该命令将创建类似命名的ZIP存档,它将扩展到命名的相对目录 EqcWTGSomeDirectoryName3435346等等......但是,您选择的最终用法/选项都取决于您最终的ZIP存档需求。


1
排除可能更好 /dir 通过使用 -mindepth 1,如果其中一个子目录与父目录具有相同的名称。
AFH

@AFH好建议!编辑我的回答添加 -mindepth 1 作为另一种避免ZIP压缩父目录的潜在方法。
JakeGould

1
我很感激帮助。我实际上使用了昨天提供的命令并略微修改它有点简单。 $ find * -maxdepth 1 -type d -exec zip -r {}.zip {} \; 完全按照我想要的方式完成,我在测试目录以及我最初发布此问题的实时目录中使用了它。
Mella

@Matt很高兴听到!快乐这有帮助。
JakeGould
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.