2013-07-22 69 views
4

是否有一个特定的Unix/Linux命令显示文件何时被重命名?我在Linux中有一个文件,想知道文件何时被重命名。我尝试过ls -ltr,但只会显示创建时的日期,而不会显示上次修改时的日期。Linux/Unix命令检查文件何时被重命名

是否有特定的Unix/Linux命令来做到这一点?

+0

这很容易演变成一个编程问题:“如何在Unix/Linux上编写程序来告诉文件何时更改?是否有任何命令已经这样做?”有一个子问题“命令是否便携?”这是shell编程的重要信息,编程(包括shell编程)专门针对SO编写。 –

回答

9

您可以使用

stat filename 

检查Access当它是最后一次读取。

更新时检查Modify

检查Change是否重命名。

加上其他像块,索引节点等

+0

谢谢......这是完美的......正是我所需要的:) – user2579439

+2

更改时间报告inode更改。重命名不会更改inode。 –

+0

我指的是“更改”字段。重命名后,我从来没有说过有关inode变化的任何信息 – bsd

1

当文件发生某些事情时,您可以使用Inotify库进行通知。 它可能与脚本语言有绑定关系。

+0

谢谢我绝对可以做到这一点...但如果一个特定的文件已被重命名,并想知​​道它是什么时候重命名然后,这就是我想知道的... – user2579439

+0

@ user2579439你无法知道过去改名。在T时刻你可以知道重命名。记录它,或者现在处理它,但是你将无法知道过去的重命名。请参阅Jonathan回答获取更多信息。 – Xaqq

6

的行为要依赖于文件系统类型的文件信息。在传统的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 X stat调用stat -f '%Sa %Sm %Sc %N'。这只与GNU/Linux stat命令略有关系。

另一方面,经验证据显示,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 
$ 

所以,你能做什么依赖于O/S在其上运行,并且文件系统类型的文件上。

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

目录上的修改时间并不是特定文件更改时间的良好指示;只要任何文件被创建,移动,删除,它都会更改。如果只有在目录中的一个文件,然后更改时间可能表明该文件被创建或重命名时,但单个文件的目录是例外,而不是规则。

0

在AIX上,您可以用等同“STAT”的 -

国家统计局的文件名

你应该能够沿着知道文件的最后更新和修改,保存时间精确到秒与更多的信息。