为什么 zip 中的 -x 排除选项似乎没有实际排除路径?

为什么 zip 中的 -x 排除选项似乎没有实际排除路径?

在 Raspberry Pi 上使用 Raspbian,我想备份 /etc 文件,但不是全部。我想排除 /etc/alternatives,所以我使用了以下命令:

sudo zip -r /home/pi/backup/$timestamp/etcfilesall.zip /etc/* –x /etc/alternatives/*

为什么这不起作用?它继续包含 /etc/alternatives 的内容,就像 /etc 中的所有其他文件夹一样。

我尝试了这些变体,但它们也不起作用

sudo zip -r –x /etc/alternatives/* @ /home/pi/backup/$timestamp/etcfilesall.zip /etc/*
sudo zip -r /home/pi/backup/$timestamp/etcfilesall.zip /etc/* –x /etc/alternatives
sudo zip -r /home/pi/backup/$timestamp/etcfilesall.zip /etc/* –x '/etc/alternatives'
sudo zip -r /home/pi/backup/$timestamp/etcfilesall.zip /etc/* –x '/etc/alternatives/*'

在递归的 -r 选项下,zip -h2 帮助显示“使用 -i 和 -x 来包含或排除路径”,所以看起来我正在尝试做的事情应该受到支持。

答案1

问题是“x”之前的“-”(对于选项“-x”)实际上并不是OP问题中的ASCII减号。相反,它是 Unicode u+2013(看起来相同,但行为不同)。

如果命令按预期输入,则它会按 OP 的最后一个示例的预期工作(此处已更正):

sudo zip -r /home/pi/backup/$timestamp/etcfilesall.zip /etc/* -x '/etc/alternatives/*'

这可能是由于从某些网站剪切/粘贴而导致的问题。

进一步阅读:

答案2

来自man zip页面:

zip -r foo foo -x \*.o

这将包括 foo.zip 中 foo 的内容,同时排除所有以 .o 结尾的文件。反斜杠避免了 shell 文件名替换,因此 zip 在所有目录级别执行名称匹配。

您必须确保您的 glob*不是由 shell 扩展,而是由zip实用程序本身扩展,否则它只会影响直接位于 /etc/alternatives 目录中的文件,而不会针对子目录。这可以通过在前面添加反斜杠*或引用它来完成:

sudo zip -r /home/pi/backup/$timestamp/etcfilesall.zip /etc/* –x /etc/alternatives/\*

然而,似乎你已经尝试过类似的方法 - 我不清楚为什么它不适合你,而它应该。尽管如此,还有其他方法可以实现类似的效果,例如在调用实用程序之前使用其他工具来排除不需要的文件zip

sudo zip -r /home/pi/backup/$timestamp/etcfilesall.zip $(sudo find /etc | grep -v ^/etc/alternatives)

相关内容