存档包含文件中的通配符

存档包含文件中的通配符

使用 创建备份时rsync --include-from=inclusion-file,包含文件支持通配符,因此您可以+ .*rc包含主目录中的所有资源文件。

Zip 还支持包含文件,但通配符不起作用,因此您必须输入每个文件名。 (我几乎会说这是一个错误,或者奇怪的缺点。有人可以透露一些信息吗?)

$ cat files
.*rc
$ ls .*rc
.ackrc  .bashrc  .mailrc
$ zip -@ out < files
    zip warning: name not matched: .*rc

有谁知道如何使通配符起作用?我能想到的唯一解决方法是将通配符模式放在命令行本身上,例如。zip -@ out < files *.rc

该问题代表所有 UNIX 归档工具。 Zip 是首选,但不是必需的。

答案1

7z(从7-拉链)将在列表文件中使用通配符(除了它自己的文件之外,还可以创建 ZIP 格式的文件)。

答案2

您对需要文字文件名zip的选项的评估似乎是正确的。-@我的文档继续说:

在Unix下,该选项与find(1)命令结合使用可以发挥强大的效果。例如,要归档当前目录及其子目录中的所有 C 源文件:

find . -name "*.[ch]" -print | zip source -@

这足以满足您的需求吗?在简单的情况下,您想要归档当前目录中匹配的所有文件.*rc,只需zip out .*rc这样做(正如您所提到的);如果您需要在子文件夹中递归地考虑所有此类文件,find可以调整上述命令:

find . -name '.*rc' | zip -@ out

答案3

您始终可以获得 shell 来扩展通配符。

bash

(
  shopt -s nullglob
  IFS=$'\n'
  set -- $(<files) # split+glob
  (($# == 0)) || printf '%s\n' "$@"
) | zip -@ out

使用zsh(同时删除带有u标志的重复项):

print -rC1 -- ${(u)~${(f)"$(<files)"}/%/(N)} | zip -@ out

假设文件名不包含换行符。

bsdtar

(
  shopt -s nullglob
  IFS=$'\n'
  set -- $(<files) # split+glob
  (($# == 0)) || printf '%s\0' "$@"
) | bsdtar --null --format zip -T - -cf out.zip

zsh:

print -rNC1 -- ${(u)~${(f)"$(<files)"}/%/(N)} |
  bsdtar --null --format zip -T - -cf out.zip

使用bsdtar,您还可以使用比 infozip 更现代/有用的存档格式。

这次,如果文件名包含换行符就可以了(尽管显然模式本身不能,因为每行都有一个换行符,files无法转义)。

请注意,这两个 shell 都对标准 shell 通配符运算符进行了扩展(其列表因 shell 和每个 shell 启用的 glob 选项而异)。

相关内容