![tar 命令用于获取定期备份的文件](https://linux22.com/image/1595968/tar%20%E5%91%BD%E4%BB%A4%E7%94%A8%E4%BA%8E%E8%8E%B7%E5%8F%96%E5%AE%9A%E6%9C%9F%E5%A4%87%E4%BB%BD%E7%9A%84%E6%96%87%E4%BB%B6.png)
我应该使用什么 tar 命令来获取在给定日期之后更改的文件(包括所有权、权限等的更改),但不包括仅从备份中恢复的文件?
另一方面,在恢复之后遍历所有文件并在恢复过程中更改每个文件的状态更改时间是否更好?
我一直在使用类似下面的命令来打包自给定日期以来所有最近修改的文件,以进行定期的穷人备份:
$ SINCE=20190501
$ tar cf - --after-date="${SINCE} 00:00:00" . | tar tvf -
这不是真正的命令,但它说明了我想要表达的观点。如果我将输出发送到 tar 文件,此命令只会转储应进入 tar 文件的文件列表。
到目前为止,我以为这个命令工作正常,直到我更换了硬盘并从备份中恢复了所有文件。查看 的输出stat
,似乎更改日期是我从备份中恢复所有文件的日期,因此现在上面的 tar 命令中选择了所有文件。
$ stat restore_file.txt
...
Modify: 2019-04-01 23:52:12.000000000 -0500
Change: 2019-05-25 01:52:10.737688040 -0500
甚至--newer-mtime
似乎没有帮助:
$ tar cf - --newer-mtime="${SINCE}" . | tar tvf -
更新:我也尝试了以下操作,但似乎也没有任何帮助,因为它仍然选择了比我想要的更多的文件:
$ SINCE=201905010000
$ touch -t "${SINCE}" /tmp/timestamp
$ stat /tmp/timestamp
Access: 2019-05-01 00:00:00.000000000 -0500
Modify: 2019-05-01 00:00:00.000000000 -0500
Change: 2019-06-30 18:29:19.277267874 -0500
$ tar cf - --after-date /tmp/timestamp . | tar tvf -
答案1
通过过滤目录:
$ tar cf - --after-date="${SINCE} 00:00:00" . | tar tvf - | grep -v '^d'
我看到我想要抓取的文件确实被抓取了,仅此而已。
由于某种原因,tar 会抓取所有目录而不考虑时间戳,但我想我可以忍受这一点,因此上述命令在大多数情况下仍然可以使用,这就是为什么在我恢复备份之前我没有发现任何问题。
现在关于恢复,我说过这会在每个恢复的文件上设置更改属性;因此,--after-date
这是没用的,因为我的下一次备份最终获得了所有文件。
为了解决这个问题,在恢复之后我第一次切换到使用--newer-mtime
:
$ tar cf - --newer-mtime="${SINCE} 00:00:00" . | tar tvf -
这让我获得了自恢复以来的所有新文件,并且我计划--after-date
从下一次备份开始再次使用原始文件。
这有一个缺点,如下所述:如果在我恢复文件和第一次备份之间有任何权限或所有权发生变化,我不会发现这一点,而且我可能永远不会发现,除非那些相同的文件的权限/所有权再次发生变化,然后我只会在那时获得更新,并且到那时为止我所有的备份都会以错误的权限/所有权恢复。
这GNU tar 手册声明如下:
如果文件的内容已被修改,或者其所有者、权限等已被更改,则认为文件的状态已更改。
我不清楚“等等”是什么意思,但我也错过了这一点。
考虑到我在这里备份的内容,我并不担心这一点,所以这次我对此没意见;但是,在我确实关心它的情况下,我可以丢弃我的增量备份,从头开始使用全新的完整备份,或者我可以按照上述步骤使用一个增量备份结束我的恢复过程,--newer-mtime
在恢复后立即使用。后者会在人们开始使用恢复的文件之前发生,因此在切换回之前我会得到一个很好的增量备份--after-date
。