使用 创建备份时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 选项而异)。