我有一个看起来像这样的备份命令:
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
Run Code Online (Sandbox Code Playgroud)
问题是它还包括空文件夹,当其中的所有文件都没有改变时,因此不包括在增量备份中。我正在寻找一种方法来避免这种情况,但我找到的唯一解决方案(将 find 的结果作为 xargs 的参数通过管道传输到 tar)仅在您拥有一个文件夹时才有效,我有其中三个。
默认情况下,tar 不提供跳过空目录的方法。话虽如此,凭空拉出一个简单的 shell 脚本来做需要做的事情并没有太多工作。
这是一个论坛讨论,当需要出现时,我找到了完全相同问题的解决方案。
主要更新:首先,我需要为我草率的复制粘贴而认真道歉。这是一个深夜的帖子,我的智力还没有达到顶峰......
正确的论坛帖子在这里。实际上是同一个人在不同的论坛上提出相同的问题,并得到完全不同的答案。遇到问题时,我已将两者都添加了书签,并提供了错误链接。
实际上,它在这里显示的是将 find 命令的输出“管道”到 tar 中的方法。你必须忽略所有关于“比”这个人问的“新”的东西。
相反,您需要的查找部分是这样的:
find . -type d ! -empty | ...
Run Code Online (Sandbox Code Playgroud)
当然,您必须将点(“.”)替换为您需要 find/tar 开始的路径。在管道之后,按照第二个链接(正确的链接)继续执行 tar 命令。
如果我因缺乏对细节的关注而造成任何麻烦,我再次深表歉意。
小智 5
仅当您仅更改一小部分文件时才有效的另一种方法是:
tar cvzf [...] `find . -mtime -1 -type f`
Run Code Online (Sandbox Code Playgroud)
如果您有大量更改,您可以将更改的文件列表转储到文件中,并在 tar 命令上使用 --files-from 参数:
find . -mtime -1 -type f > /tmp/changed.txt
tar cvzf [...] --files-from=/tmp/changed.txt
Run Code Online (Sandbox Code Playgroud)
或在一行中
find . -mtime -1 -type f | tar cvzf [...] --files-from=/dev/stdin
Run Code Online (Sandbox Code Playgroud)