tar 排除单个文件/目录,而不是模式

Posted

技术标签:

【中文标题】tar 排除单个文件/目录,而不是模式【英文标题】:tar exclude single files/directories, not patterns 【发布时间】:2012-05-17 16:36:18 【问题描述】:

我正在使用tar 对服务器进行每日备份,并希望避免备份 /proc 和 /sys 系统目录,但不排除文件树中其他位置名为“proc”或“sys”的任何目录.

例如,具有以下目录树(“bla”是普通文件):

# find
.
./sys
./sys/bla
./foo
./foo/sys
./foo/sys/bla

我想排除 ./sys ./foo/sys

我似乎找不到可以做到这一点的--exclude 模式...

# tar cvf /dev/null * --exclude=sys
foo/

或者...

# tar cvf /dev/null * --exclude=/sys
foo/
foo/sys/
foo/sys/bla
sys/
sys/bla

有什么想法吗? (Linux Debian 6)

【问题讨论】:

你确定没有排除?如果您使用的是 MAC OS,那就另当别论了!看here 不确定我是否理解您的问题。有一个 --exclude 选项,但我不知道如何将它匹配为单个绝对文件名(不是该名称的任何文件) - 请参阅上面的示例。 看这里:***.com/questions/984204/… 【参考方案1】:

您可以指定排除模式的绝对路径,这样其他sysproc 目录将被归档:

tar --exclude=/sys --exclude=/proc /

【讨论】:

是的,但重要的细节是排除的文件名必须与 tar 列表报告的符号完全匹配。对于我的例子,那就是./sys - 我现在才发现。【参考方案2】:

在这种情况下,您可能希望使用:

--anchored --exclude=sys/\*

因为如果你的 tar 没有显示前导的“/”,你的过滤器就有问题。

【讨论】:

这对我有用,谢谢!我想排除一个特定的目录,而不是所有与模式匹配的目录/子目录。但是 bsdtar 没有“--anchored”选项,使用 bsdtar 我们可以使用完整路径来排除特定文件夹。 啊找到了!在 bsdtar 中,锚点是“^”:bsdtar cvjf test.tar.bz2 --exclude myfile.avi --exclude "^myexcludedfolder" *【参考方案3】:

使用 tar 你可以通过在任何应该跳过的目录中放置一个标记文件来排除目录。

创建标签文件,

touch /sys/.exclude_from_backup
touch /proc/.exclude_from_backup

那么,

tar -czf backup.tar.gz --exclude-tag-all=.exclude_from_backup *

【讨论】:

理论上好主意,但通常 /sys 和 /proc 无法写入。

以上是关于tar 排除单个文件/目录,而不是模式的主要内容,如果未能解决你的问题,请参考以下文章

tar压缩文件,排除指定文件不压缩

【tar】tar命令exclude选项排除指定文件或目录

linux tar压缩排除某个文件夹

linux tar压缩排除某个文件夹

tar 压缩排除问题

Linux tar压缩命令 排除某个目录 (根据man tar 总结)