给定一个包含文件的树结构,说:
source |-- bar | +-- three.txt |-- baz | +-- four.txt +-- foo |-- one.txt +-- two.txt
如果我做
tar czvf dest/archive-1.tgz --listed-incremental dest/archive.snar source/*
这将创build一个包含所有当前文件和文件夹的.tgz文件,正如我所期望的那样:
source/bar/ source/baz/ source/foo/ source/bar/three.txt source/baz/four.txt source/foo/one.txt source/foo/two.txt
如果我马上做:
tar czvf dest/archive-2.tgz --listed-incremental dest/archive.snar source/*
这似乎创build.tgz文件包含当前目录的所有子文件夹,没有文件:
source/bar/ source/baz/ source/foo/
这不是我想要的。 就像这样的一个玩具例子来说,它并没有那么糟糕,但是在一个大的文件夹结构中,很难说这个.tgz基本上是空的。 这是很多的噪音。 理想情况下, tar会告诉我,没有更新的文件,并退出一个错误代码,但即使它做了一个空的焦油,这将是更好的(对于我来说,在这种情况下)比大量空文件夹的档案。
有没有办法让tar --listed-incremental像我想要的那样行事? 我已经做了一些searchfind解决scheme,但我还没有find很多。
我最终可能会停止使用--listed-incremental并且用find来组装一个文件列表,但是如果有一种方法可以让--listed-incremental做我想做的事情,那么这将是更多的工作。 有什么build议么?
手册页提到:
从增量备份中提取时,GNU tar尝试恢复文件系统在创build存档时的确切状态。 尤其是,它将删除文件系统中创build归档时不存在于其目录中的那些文件。
要实现这一点,他们需要在归档文件中包含所有已删除文件的列表或所有目录索引节点的副本,以便相关文件可以被删除的特殊文件。 为了与档案格式保持一致,对于他们来说可能更干净,只是包含目录,而不是使用额外的文件复杂化。