如何在排除部分文件时将文件添加到zip压缩包

4
关于zip,我正在寻找一种方法,确保文件被添加到存档中,而不受传递给存档创建排除列表的影响。
在我的情况下,我开发了一个应用程序,允许用户在创建zip时指定自己的排除过滤器。
然而,我需要确保一些自定义文件始终被添加到归档中,而与过滤器中指定的内容无关。
例如:
过滤器指定为:"*.bar" 我需要添加的文件:foo.bar 因此,如果我执行:
zip -rq -i foo.bar -x "*.bar"

foo.bar不会被包含在存档文件中。

因此问题来了:

  • 如何覆盖排除列表中的内容,以添加需要的几个文件?
  • 或者,能否开发一个排除表达式,将用户指定的内容与有效地说省略所有但是foo.bar相结合?

我想出的解决方案是采取两种方法-首先使用排除列表创建归档文件,然后通过foo.bar扩展归档文件,但我正在寻找一种在单次操作中完成它的方法。

谢谢


最简单的方法是首先使用用户定义的排除列表运行ZIP压缩,然后再次运行ZIP压缩,将必须始终添加到归档中的文件添加到已创建的ZIP文件中,并使用跳过已存在于归档文件中的文件所需的选项。在最好的情况下,在第二次执行时不会向ZIP文件添加任何文件,在最坏的情况下,所有“始终添加”的文件都将在第二次执行时添加。 - Mofi
谢谢Mofi。我现在正在做这个,但它有一个缺点 - 在保留现有存档的同时生成了一个全新的存档,至少是暂时的。这可能会导致磁盘空间问题。话虽如此,解决双重创建的一种方法是将压缩设置为“存储”而不是压缩(使用“-0”开关),这样您可以在事后添加文件,而不会遭受构建全新存档的惩罚。 - Bob Riley
1个回答

1
-i选项用于仅包含指定的文件。使用模式"foo.bar",我们仅包含名为foo.bar的文件,留下其他文件。 -x选项用于排除文件。使用模式*.bar,我们排除了之前包含的foo.bar文件。
此外,您必须考虑到模式将被解析为路径名扩展,而不是作为POSIX或Perl正则表达式。如果要创建更复杂的模式,可以使用扩展模式
例如:
shopt -s extglob
zip -rq foo.zip . -i ?(foo.bar|!(*.bar))
shopt -u extglob

或者:

shopt -s extglob
zip -rq foo.zip . -x !(!(*.bar)|foo.bar)
shopt -u extglob

但是最后的命令不是递归的,因为模式没有考虑子目录。尽管我们使用了-r选项,但我们只包含模式中的文件。手册页面告诉我们在*之前写上\以递归应用,但并不适用于所有模式。

您还可以使用其他命令获取要包含的文件列表。

例如:

zip -rq foo.zip . -i `find ./ -not -name "*.bar" -o -name "foo.bar"`

或者:

zip -r foo.zip . -x `find ./ -name "*.bar" -a -not -name "foo.bar"`

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接