我们需要备份文件和目录的 a/c/mtime-stamps,并有能力在必要时恢复它们。
备份的示例命令可能是:
$ timestamp backup --all-stamps --incl-dir-stamps --recursive out.stampbak file.bin /dir/with/files/
恢复可能是:
$ timestamp restore --all-stamps out.stampbak
是否存在这样的命令来实现我正在寻找的结果?纳秒精度将是首选,或者其他更精细的精度,尽管我相信大多数文件系统停止在纳秒。POSIX 合规性也很重要,因为我们需要支持/恢复 BSD 和 GNU/Linux 系统上的时间戳。
编辑:为了澄清一些事情,我列出的文件系统在很大程度上是暂时保留文件,直到我最终可以将它们移动到主 ZFS 服务器。这就是让我们考虑在将数据迁移到 ZFS之前保留时间戳的可能性的原因。以防邮票在传输过程中发生变化(我们使用 HTTP、FTP、SMB 等多种方法),我们希望确保它们可以恢复到应有的状态。即使是在传输后,将时间戳保留为小备份也是有益的,因此无论文件最终会在 ZFS 上结束,问题仍然是仅支持/恢复时间戳。可以从备份中省略权限和组信息。
用于备份时间戳的操作系统包括 macOS Mojave 10.14.6、Ubuntu Server 18.04.5 LTS、Debian 10.2/7.8、FreeBSD 12.2 和 CentOS 8。恢复将主要在 FreeBSD(ZFS 服务器主机)上完成,我不认为在其他任何地方都没有必要。如果有帮助的话,我有几个驱动器,其中包含 NTFS 分区上的文件。是否有必要运行一个小型 Windows 实例来正确备份这些标记?
此外,我的印象是大多数文件系统使用 atime、ctime 和 mtime,而没有其他文件系统(我认为这最终在文件系统之间有所不同)。如果可能的话,我的目标是保存和恢复所有这些。
我提到了 POSIX 合规性,该工具可以在任一平台上使用——如果我之前的描述不正确或不充分,我深表歉意。我还认为 ctime = 创建/出生时间,我现在看到它是更改时间。
要保留的最重要的时间戳是创建/出生时间和修改时间。访问时间也会很好,更改时间是最不重要的,但仍然会有所帮助。再次,我为这个错误道歉,我还在学习。
编辑 2:从这篇文章中我了解到:
大多数文件系统中没有保存文件创建时间戳——这意味着你不能运行诸如“显示在特定日期创建的所有文件”之类的命令。这就是说,通常可以从 ctime 和 mtime 推断出相同的内容(如果它们匹配 - 这可能意味着那是文件创建的时间)。
创建新文件或目录时,通常将所有三个时间(atime、ctime 和 mtime)都配置为捕获当前时间。
由于目标文件系统将是 ZFS,文件/目录的时间戳将在其中恢复,因此最好至少保存 atime、ctime、mtime,以防保存时间戳的文件系统不存储出生时间。
如果你有 GNU find 和 Perl,你可以用它们来装点东西。可以打印时间戳的
-printf
操作find
,Perl 具有utime
修改它们的功能。或者两个,内置一个,一个在 Time::HiRes 模块中,后者支持亚秒级精度。一些用于测试的文件:
将时间戳保存到文件中:
让我们删除时间戳:
并从文件中重新加载它们:
该文件仅包含带有 atime、mtime 和文件名的以 NUL 结尾的字段,并且 Perl 片段调用
utime
每组值。使用 NUL 作为终止符,它应该能够处理任意文件名,但请注意,我在这里使用
\n
而不是\0
用于打印输出,这不适用于该 Perl 代码段,因为它需要 NUL,而不是换行符。另外,我完全忽略了 ctime,因为据我所知,它无论如何都不能用
utime()
/设置。utimensat()
任何出生时间戳都一样。如前所述,设置
ctime
和类似设置的唯一方法是从内核内部和用户界面界面,有充分的理由不允许设置超出atime
和的时间戳mtime
。如果您想保留ctime
andcrtime
,可以使用ZFS/send
and来完成ZFS/receive
,但这需要双方都已经有 ZFS。所以让我重复一下我相信你喜欢做什么:
将现有文件系统复制到另一个位置
稍后通过不同的程序保留
atime
并mtime
在执行此复制或恢复时间戳时。您可以通过运行任何备份/恢复方法,然后运行另一个恢复时间戳的程序或运行能够正确恢复时间戳的备份/恢复方法来做到这一点。
star
是一个成熟的备份工具,可以帮助您使用这两种方法。如果您喜欢用来
star
备份和恢复包括时间戳在内的文件系统,请查看手册页:http ://schilytools.sourceforge.net/man/man1/star.1.html如果您想分别保存和恢复时间戳,则需要在运行备份之前保存时间戳,因为备份很可能会影响
atime
所有文件的值。要保存目录树中所有文件的所有时间戳,只需运行:
要将所有时间戳恢复到新位置,请运行:
第一个命令创建的存档文件使用大约。每个文件 1.5 KB。第二个命令将从存档中的所有文件中恢复所有时间戳,这些文件已经存在,但不会触及文件内容。
BTW:我是 39 年以来的明星作者。
“ls --full-time”命令为可以使用“awk”格式化并使用“date”保存到以当前时间命名的文件的文件提供完整的时间戳:
这会产生类似的东西:
这将允许您跟踪文件时间戳随时间的变化。当然,您可以随意格式化时间戳。
您还可以使用“git”存储库来跟踪 timestamp.output 文件随时间的变化。