Linux 即使是排除模式的一部分,如何将文件添加到zip

Linux 即使是排除模式的一部分,如何将文件添加到zip,linux,unix,zip,Linux,Unix,Zip,关于zip,我正在寻找一种方法来确保将文件添加到存档中,而不依赖于已传递到存档创建排除列表的内容 在我的实例中,我开发了一个应用程序,允许用户在创建zip时指定自己的排除过滤器 但是,我需要确保始终将两个自定义文件添加到存档中,而与过滤器中指定的内容无关 例如: 指定的筛选器:“*.bar” 我需要添加的文件:foo.bar 所以如果我执行 zip -rq -i foo.bar -x "*.bar" foo.bar将不包含在存档中 因此,归根结底是: 对于我需要添加的几个文件,如何覆盖排

关于zip,我正在寻找一种方法来确保将文件添加到存档中,而不依赖于已传递到存档创建排除列表的内容

在我的实例中,我开发了一个应用程序,允许用户在创建zip时指定自己的排除过滤器

但是,我需要确保始终将两个自定义文件添加到存档中,而与过滤器中指定的内容无关

例如:

  • 指定的筛选器:“*.bar”
  • 我需要添加的文件:foo.bar
所以如果我执行

zip -rq -i foo.bar -x "*.bar"
foo.bar将不包含在存档中

因此,归根结底是:

  • 对于我需要添加的几个文件,如何覆盖排除列表中的内容
  • 或者,是否可以开发一个排除表达式,将用户指定的内容组合在一起,有效地表示忽略foo.bar以外的所有内容
我提出的一个解决方案是对其进行两次处理—首先使用排除列表创建一个存档,然后通过foo.bar扩展存档,但我正在寻找一种一次性完成的方法


谢谢使用
-i
选项仅包含指定的文件。对于模式“foo.bar”,我们只包括名为foo.bar的文件,而不包括其他文件

-x
选项用于排除文件。对于pattern
*.bar
我们排除了前面包含的
foo.bar
文件

你也必须考虑这些模式将被分解为POSIX或Perl正则表达式。如果你想做更复杂的模式,你可以使用

举例来说:

shopt -s extglob
zip -rq foo.zip . -i ?(foo.bar|!(*.bar))
shopt -u extglob
zip -rq foo.zip . -i `find ./ -not -name "*.bar" -o -name "foo.bar"`
或:

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

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

举例来说:

shopt -s extglob
zip -rq foo.zip . -i ?(foo.bar|!(*.bar))
shopt -u extglob
zip -rq foo.zip . -i `find ./ -not -name "*.bar" -o -name "foo.bar"`
或:


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