创建 tar 时可以排除空目录吗?

创建 tar 时可以排除空目录吗?

我有一个如下所示的备份命令:

tar cvpzf /backup/incremental-$now.tar.gz --after-date='1 day ago' -C / etc/ home/ root/  --exclude-from=/root/exclusion_list.txt --warning=no-file-unchanged > /backup/log-$now.txt 2>&1

问题是它还包含空文件夹,而其中的所有文件均未更改,因此未包含在增量备份中。我正在寻找避免这种情况的方法,但我找到的唯一解决方案(将 find 的结果作为 xargs 的参数传输到 tar)仅在您有一个文件夹时才有效,我有三个文件夹。

答案1

默认情况下,tar 不提供跳过空目录的方法。话虽如此,但凭空想出一个简单的 shell 脚本来完成需要做的事情并不算太费事。

这里是一个论坛讨论,当需要时,我在其中找到了完全相同问题的解决方案。

重大更新:首先,我要为我草率的复制粘贴行为诚恳道歉。这是一篇深夜帖子,当时我的智力还没有达到巅峰……

正确的论坛帖子是这里。其实是同一个人在另一个论坛问了同一个问题,却得到了完全不同的答案。我遇到这个问题时已经收藏了这两个网站,但给出的链接却是错误的。

实际上,这里显示的是将 find 命令的输出“通过管道”传输到 tar 的方法。您必须忽略该人询问的有关“更新”的所有内容。

相反,您需要的查找部分是这样的:

find . -type d ! -empty | ...

当然,您必须将点(“。”)替换为需要 find/tar 启动的路径。管道之后,按照第二个链接(正确的链接)继续使用 tar 命令。

如果由于我缺乏对细节的关注而给您带来任何麻烦,我再次深表歉意。

答案2

另一种方法仅在您仅更改了一小部分文件时才有效:

tar cvzf [...] `find . -mtime -1 -type f`

如果您有大量更改,您可以将更改的文件列表转储到文件中,并在 tar 命令上使用 --files-from 参数:

find . -mtime -1 -type f > /tmp/changed.txt
tar cvzf [...] --files-from=/tmp/changed.txt

或者在一行中

find . -mtime -1 -type f | tar cvzf [...] --files-from=/dev/stdin

相关内容