7

是否有特定的 Unix/Linux 命令会在文件重命名时显示?我在 Linux 盒子中有一个文件,想知道文件何时重命名。我试过ls -ltr了,但该命令只显示它的创建日期,而不是最后一次修改的日期。

是否有特定的 Unix/Linux 命令来执行此操作?

4

4 回答 4

17

您可以使用

stat filename

检查Access上次阅读的时间。

检查Modify它何时更新。

检查Change它是否被重命名。

加上其他文件信息,如块、inode 等。

于 2013-07-22T14:13:28.663 回答
7

行为将取决于文件系统类型。在经典的 Unix 文件系统(尤其是 Mac OS X HFS 文件系统)上,在文件系统中重命名文件的有趣之处在于它根本不影响文件的 inode。它只影响文件从/到的目录(或目录)。因此,在单个文件系统中,重命名更改的唯一时间戳是保存文件的目录的修改时间。例如*

$ fl -a -c -m -n xxx.pl
2013-07-17 16:17:17 2013-07-17 16:17:17 2013-07-17 16:17:17 xxx.pl
$ mv xxx.pl yyy.pl
$ fl -a -c -m -n yyy.pl
2013-07-17 16:17:17 2013-07-17 16:17:17 2013-07-17 16:17:17 yyy.pl
$

这意味着在此类文件系统上,您无法判断文件何时在文件重命名后的某个时间被重命名。

*fl是自制命令;该调用等效于 Mac OS Xstat调用stat -f '%Sa %Sm %Sc %N'。这仅与 GNU/Linuxstat命令略微相关。

另一方面,经验证据表明,Linux ext4 文件系统确实会随着 inode 本身的修改时间的变化而记录名称的变化。

$ stat -c '%x %y %z %n' test.dat
2013-07-19 10:31:31.803842672 -0700 2013-07-19 10:31:31.803842672 -0700 2013-07-19 10:31:31.803842672 -0700 test.dat
$ mv test.dat test.data
$ stat -c '%x %y %z %n' test.data
2013-07-19 10:31:31.803842672 -0700 2013-07-19 10:31:31.803842672 -0700 2013-07-22 09:11:49.074339525 -0700 test.data
$

因此,您可以做什么取决于您正在运行的操作系统以及您的文件所在的文件系统类型。

如果您有可用且正在运行的 inotify 服务,您可以记录文件重命名事件,但如果您不记录该事件,则无法知道文件何时重命名。

目录上的修改时间并不能很好地指示特定文件何时更改;每当创建、移动、删除任何文件时,它都会发生变化。如果目录中只有一个文件,则更改时间可能指示该文件的创建或重命名时间,但单个文件目录是例外而不是规则。

于 2013-07-22T14:17:41.067 回答
2

您可以使用inotify库(手册页)在文件发生某些事情时收到通知。很可能存在与脚本语言的绑定。

于 2013-07-22T14:08:00.873 回答
1

在 AIX 上,您可以使用等效的“stat” -

isat 文件名

您应该能够知道文件的最后更新、修改和访问时间(精确到秒)以及更多信息。

于 2014-02-24T12:53:07.570 回答