文件系统支持

文件系统支持

我只知道这一点ls -t,并对ls -f目录下的文件和子目录进行不同的排序。

  • 文件的时间戳、修改时间和创建时间有什么区别?
  • 如何通过命令获取和更改这些信息?
  • 人们说一个文件比另一个文件“更新”是根据什么样的信息?
  • 哪些信息的改变不会使文件发生变化?

例如,我看到有人写道:

默认情况下,rsync 程序仅查看文件的大小和时间戳是否不同。它不关心哪个文件更新,如果不同,它就会被覆盖。您可以将“--update”标志传递给 rsync,这将导致它跳过目标上的文件(如果它们比源上的文件新),但前提是它们是相同类型的文件。这意味着,例如,如果源文件是常规文件而目标文件是符号链接,则无论时间戳如何,目标文件都将被覆盖。

顺便说一句,这里的文件类型是否仅指常规文件和 simlink,而不是 pdf、jpg、htm、txt 等类型?

答案1

有3种“时间戳”:

  • 访问 - 上次读取文件的时间
  • 修改——文件最后一次修改时间(内容已被修改)
  • 更改 - 文件的元数据上次更改的时间(例如权限)

要显示此信息,您可以使用stat这是 coreutils 的一部分。

stat还会向您显示更多信息,如设备、索引节点、链接等。

请记住,此类信息很大程度上取决于文件系统和安装选项。例如,如果您使用该noatime选项安装分区,则不会写入任何访问信息。

更改时间戳的实用程序是touch。有一些参数可以决定要更改哪个时间戳(例如 -a 表示访问时间,-m 表示修改时间)并影响新给定时间戳的解析。看man touch更多细节。

touchcp -u(“仅当源文件比目标文件新或目标文件丢失时才复制”)或用于创建空标记文件。

答案2

echox 的答案是有效的,但我想添加有关文件创建时间的信息。

文件系统支持

某些文件系统支持在 inode 中添加有关创建时间(或出生时间)的附加条目。我知道ext4 支持此功能并且JFS 和 BTRFS

然而,大多数工具和 API 尚未更新以读取这些额外信息。因此,尽管它可能存在,但无法访问。

例如,在 Ubuntu 12.04 LTS 上,我今天创建的文件得到以下内容:

$ echo Just another test > /tmp/mytest
$ sleep 3
$ touch /tmp/mytest
$ sleep 2
$ cat /tmp/mytest > /dev/null
$ stat /tmp/mytest 
[...]
Access: 2012-06-05 13:33:44.279774711 +0200
Modify: 2012-06-05 13:33:34.611893317 +0200
Change: 2012-06-05 13:33:34.611893317 +0200
 Birth: -
$ sudo debugfs -R 'stat /tmp/mytest' /dev/sda1
[...]
 ctime: 0x4fcdee8e:91e30114 -- Tue Jun  5 13:33:34 2012
 atime: 0x4fcdee98:42b417dc -- Tue Jun  5 13:33:44 2012
 mtime: 0x4fcdee8e:91e30114 -- Tue Jun  5 13:33:34 2012
crtime: 0x4fcdee46:01258f1c -- Tue Jun  5 13:32:22 2012
[...]

您可以看到较新的 stat 函数有一个birth 字段,但输出似乎不正确。通过 debugfs 我们可以获得信息(crtime,因为我在 ext4 文件系统上)。

统计支持

现在有从内核 4.11 开始,新的 statx 系统调用,除了更好的支持2038年或网络文件系统,它还带来了一些额外的功能,如btime或出生时间(创建时间)访问。对 ext4 的支持应该在同一内核版本 4.11 中。

在以后的内核版本中已经有补丁添加了对这个新系统调用的支持:例如内核 4.13 中的 BTRFS 和 F2FS、4.14 中的 SMB3、4.15 中的 GFS2、4.16 中的 NFS 等。

该系统调用被包装在GNU C 库 2.28 及更高版本

相关内容