我只知道这一点ls -t
,并对ls -f
目录下的文件和子目录进行不同的排序。
- 文件的时间戳、修改时间和创建时间有什么区别?
- 如何通过命令获取和更改这些信息?
- 人们说一个文件比另一个文件“更新”是根据什么样的信息?
- 哪些信息的改变不会使文件发生变化?
例如,我看到有人写道:
默认情况下,rsync 程序仅查看文件的大小和时间戳是否不同。它不关心哪个文件更新,如果不同,它就会被覆盖。您可以将“--update”标志传递给 rsync,这将导致它跳过目标上的文件(如果它们比源上的文件新),但前提是它们是相同类型的文件。这意味着,例如,如果源文件是常规文件而目标文件是符号链接,则无论时间戳如何,目标文件都将被覆盖。
顺便说一句,这里的文件类型是否仅指常规文件和 simlink,而不是 pdf、jpg、htm、txt 等类型?
答案1
有3种“时间戳”:
- 访问 - 上次读取文件的时间
- 修改——文件最后一次修改时间(内容已被修改)
- 更改 - 文件的元数据上次更改的时间(例如权限)
要显示此信息,您可以使用stat
这是 coreutils 的一部分。
stat
还会向您显示更多信息,如设备、索引节点、链接等。
请记住,此类信息很大程度上取决于文件系统和安装选项。例如,如果您使用该noatime
选项安装分区,则不会写入任何访问信息。
更改时间戳的实用程序是touch
。有一些参数可以决定要更改哪个时间戳(例如 -a 表示访问时间,-m 表示修改时间)并影响新给定时间戳的解析。看man touch
更多细节。
touch
与cp -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 及更高版本。