压缩某些子文件夹的内容,但不压缩其他子文件夹的内容

压缩某些子文件夹的内容,但不压缩其他子文件夹的内容

我想使用 unix zip 命令来压缩目录。假设该目录的结构如下:

dir1/
dir1/dir2/
dir1/dir2/file1
dir1/dir2/file2
dir1/dir3
dir1/dir3/file1
dir1/file1
dir1/file2

我想压缩dir1dir1.zip包含,但不dir1.zip包含。简而言之,我想压缩 下的所有文件及其所有文件,但不压缩任何文件。dir1/file1, dir1/file2, dir1/dir2/file1, dir1/dir2/file2, dir3/dir1/dir3/file1dir1dir2dir3

如果我这样做zip dir1 dir1/,它将压缩 中的所有内容dir1、所有文件和子文件夹,但不压缩子文件夹的内容。如果我这样做zip -r dir1 dir1/,它将压缩 中的所有内容dir1,包括其所有文件及其子文件夹的所有文件。我希望能够控制哪些子文件夹应该递归压缩,哪些不应该。

谢谢。

答案1

$ zip -r dir1 dir1 -x dir1/dir3/*

对我有用。这-x是排除选项。您还可以使用包含选项,但在这种情况下,排除选项需要较少的键入。

其实这个问题并不完全清楚。您是否希望排除 下的所有目录和文件dir3,或者仅排除 下的文件dir3?上面的命令仅适用于后者。

答案2

使用存档文件的一种方法是安装它们,然后像​​普通目录一样访问它们。保险丝可用于大多数unices并支持多个文件系统透明地访问压缩文件。对于 zip 文件,可能性包括保险丝拉链AVFS也很方便,但只读)。

例如,使用 fusion-zip,以下是如何挂载存档并将文件复制到其中的方法。

mkdir tmp
fuse-zip /path/to/zip tmp
rsync -av --exclude='/dir1/dir3/*' dir1 tmp/
fusermount -u tmp; rmdir tmp

答案3

从 dir1 的父目录尝试此命令:

tar --exclude=dir3/* -cf - dir1/ | zip dir1.zip -

要解压缩 dir1.zip,请使用以下命令:

unzip -p dir1.zip | tar xf -

答案4

唯一可靠的方法是传递zip要存档的文件列表,例如:

find dir1 \! \( -path dir1/dir3 -prune \) | sort | zip dir1.zip -@

这可确保存档既不包含排除的目录也不包含其任何后代。的参数必须与该目录的输出-path完全匹配。find这个答案了解如何修剪多个目录。

相关内容