我想使用 unix zip 命令来压缩目录。假设该目录的结构如下:
dir1/
dir1/dir2/
dir1/dir2/file1
dir1/dir2/file2
dir1/dir3
dir1/dir3/file1
dir1/file1
dir1/file2
我想压缩dir1
成dir1.zip
包含,但不dir1.zip
包含。简而言之,我想压缩 下的所有文件及其所有文件,但不压缩任何文件。dir1/file1, dir1/file2, dir1/dir2/file1, dir1/dir2/file2, dir3/
dir1/dir3/file1
dir1
dir2
dir3
如果我这样做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
看这个答案了解如何修剪多个目录。