确定文件系统时间戳精度

确定文件系统时间戳精度

文件时间戳精度对于 EXT3 限制为一秒,对于 UFS 限制为一微秒,对于 EXT4 限制为一纳秒(至少根据经验)。有什么方法可以仅根据文件系统信息来确定这一点?

我能想到的另类替代方案是将所有单元测试限制为几秒(我现在就是这么做的),或者touch限制一堆文件并检查stat -c %x.

答案1

据我所知,没有任何地方存储这些信息。它被编码到文件系统中。但是,您可以手动创建文件系统列表和相应的精度。我将使用一个case语句来根据您的文件系统列表测试文件系统 ID。您可以将默认值设置为 1,因为很少有精度小于 1 秒的示例。

根据我在网上阅读的内容,旧版本的 FAT 和当前版本的 zip 使用 2 秒时间戳精度。不过,我建议您对此进行事实核查。

您可以使用以下命令获取文件文件系统的 ID。

stat -f --format="%t" $file

答案2

通常你可以使用状态文件系统或者路径配置,但他们似乎不支持任何方式来找出该信息。

显然这样的功能是正在讨论中未来的 POSIX 标准

我们还将归档一些 aardvarks 以进行路径配置增强,以返回每个路径的时间戳粒度。

不幸的是,我今天看不到任何干净的方法来做到这一点,即使是以特定于操作系统的方式也是如此。


任何尝试构建文件系统列表以及是否支持亚秒分辨率的方法都是危险的。例如,ext4如果 inode 为 256 字节,则似乎支持纳秒分辨率,但如果 inode 为 128 字节,则不支持。

编制全面且准确的列表会很困难,可能需要 root 访问权限,而且明天可能会发生变化。对我来说,这听起来比跑stat几次更难。

答案3

我刚刚实现了对文件数据库的检测。我首先将文件的时间戳设置为 1234 毫秒,然后再次读取并检查它是 1234(至少毫秒精度)还是 1000(秒精度)。到目前为止我学到的东西是:

  • XFS 和 EXT3:第二精度
  • EXT4:毫秒精度
  • NTFS:100ns 精度(好的,从文档中得到这个......)

答案4

对于带有 BTRFS(默认文件系统)的 Linux Fedora 35,我看到以下精度:

stat test1.txt

Access: 2021-11-25 19:48:58.254916839 +0000
Modify: 2021-11-22 09:54:48.694107073 +0000
Change: 2021-11-22 09:54:48.698107163 +0000
 Birth: 2021-11-22 09:54:48.694107073 +0000

但尚不清楚这些值有多准确。

相关内容