我有一个看起来像这样的备份命令:
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的唯一解决scheme(将find的结果用xargs作为参数进行pipe道化)只是在您有一个文件夹时才起作用,其中有三个。
在默认情况下,tar不提供跳过空目录的方法。 这就是说,简单的shell脚本无需做太多的工作就可以完成。
这里是一个论坛讨论,当需求出现的时候,我find了解决同样问题的解决scheme。
主要更新:首先,我需要认真道歉我的草稿复制粘贴。 这是一个深夜的职位,我并没有达到我的智慧的顶峰。
正确的论坛post在这里 。 其实这是同一个人在不同的论坛上问同一个问题,得到一个完全不同的答案。 当我遇到问题时,我已经收到了书签,并给出了错误的链接。
实际上,这里显示的是将find命令的输出“pipe”到tar的方式。 你必须忽略所有关于“新人”的东西。
相反,您需要的查找部分是这样的:
find . -type d ! -empty | ...
当然,你必须用你需要查找/ tar开始的pathreplace点(“。”)。 在pipe道继续与第二个链接的tar命令(正确的)之后。
如果我不注意细节,造成麻烦,我再次深表歉意。
另一种只有当你只有一小部分文件改变时才有效的方法是:
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