我有一个如下所示的备份命令:
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