如何查找文件系统上最近创建的文件?

Pav*_*Pav 5 command-line filesystems date

我试图通过检测静默安装程序创建的最后一个文件是否存在来跟踪静默安装程序的完成情况,但为了做到这一点,我需要找出是哪个文件。有什么办法可以做到这一点吗?我找到了很多关于如何查找最近修改的文件的答案,但这并不有效,因为其中许多文件是由原始创建者以与安装程序添加到系统中的顺序不同的顺序修改的。

Tho*_*key 3

同意更改时间(又名ctime)是可以在 *nix 文件系统上观察到的最可移植的功能,OP 可能需要更多细节。

POSIX<sys/stat.h>为文件系统上的每个文件、目录、设备记录三个时间戳:访问修改更改utimes前两个可以使用(尽管标记为扩展但广泛可用)设置为任意值,但最后一个不能。作为许多系统调用(包括utimes. 很可能它最常由 更新chmod,但移动或重命名文件也可以执行此操作。

但是,如果您碰巧正在寻找有关文件创建时间的线索,那么ctime就是您可能找到的很好的线索。访问时间也很有用,但可以配置某些文件系统来避免更新它。首先看ctime

该程序(也记录在 POSIX 中)包含使用ctime 的find选项:

-ctime n
如果从初始化时间中减去文件状态信息的最后一次更改的时间除以 86400(丢弃任何余数)为n ,则主设备应评估为 true 。

86400一天中的秒数;n是整数(天数)。一些实现find提供了更小的单元,但 POSIX 中没有这些。

您可以像这样使用它来获取过去一天内更改的文件列表:

find . -ctime -1 -print
Run Code Online (Sandbox Code Playgroud)

某些实现可能允许n使用非整数值,但 POSIX 在这里是明确的:

在描述中,无论何时使用n作为主要参数,它都应被解释为十进制整数,可选地在前面加上加号 ( '+' ) 或减号 ( '-' )

因此不可能在这个方向上有一个符合 POSIX 标准的扩展。其他实现可以提供替代选项,其(例如)将时间差指定为分钟数。您应该查阅您正在使用的系统的手册find,看看这是否适用于您。

其中一条评论提到了一些带有扩展名(也称为非标准)的文件系统来获取实际的文件创建时间。多年来,各种系统都出现过这种情况,包括

  • VMS(后来更名为OpenVMS),具有创建备份修订过期时间戳。
  • Windows,具有创建访问修改时间戳(请注意,虽然名称相似,但更新规则与 POSIX 不同)。

How to get file create date in Linux?有更相关的讨论。,其中提到了结构st_birthtime的成员statstat(2)这在 OSX和 FreeBSD的手册页stat(2)以及特定于系统的 FreeBSDstat(1)和 OSX实用程序中都有记录stat(1)。(NetBSD 也记录了此扩展)。简称为现代 BSD 系统的一个功能。

相应的find实用程序也支持该扩展(例如,参见 OSX find(1)):

所有与-B* 出生时间相关的初选都是 IEEE Std 1003.1-2001 (``POSIX.1'') 的扩展。

其他系统没有这个扩展。供讨论: