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

28

我正在使用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,那就是另一回事了!在这里看看:http://www.gnu.org/software/tar/manual/html_node/exclude.html#SEC108 - drinchev
不确定我理解你的问题。有一个“--exclude”选项,但我不知道如何为单个绝对文件名匹配它(不是任何具有相同名称的文件)-请参见我上面的例子。 - Udo G
请看这里:https://dev59.com/_HNA5IYBdhLWcg3wYMt- - paulsm4
3个回答

16

你可以指定绝对路径来排除某些文件或目录,这样其他的sysproc目录也会被归档:

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

4
正确,但重要的细节是被排除的文件名必须与“tar”列表报告的符号完全匹配。对于我的例子,那将是“./sys” - 正如我刚刚发现的。 - Udo G

7
在这种情况下,您可能想要使用以下内容:
--anchored --exclude=sys/\*

因为如果您的tar文件不显示前导“/”,则过滤器会出现问题。

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

7
使用tar命令时,您可以通过在应该跳过的任何目录中放置一个标记文件来排除目录。
创建标记文件,请按以下步骤操作:
touch /sys/.exclude_from_backup
touch /proc/.exclude_from_backup

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

2
理论上是个好主意,但通常无法写入/sys和/proc。 - pjv

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接