确定文件是否已被修改


10

在Linux(当前使用ext4文件系统)中,如何在读取文件内容的情况下快速检查文件内容是否已被修改?

stat命令是推荐的方法吗?我目前正在

$ stat --format "%Y" hello.txt

然后我可以检查相同的命令是否产生相同的输出。如果是这样,我得出结论hello.txt没有更改。

我的感觉是,想要输入更多的参数来更加确定。例如,添加文件大小,文件名等是否可以提供更好的文件“指纹”?

关于这个主题,我记得增量备份程序始终忽略了我曾经拥有的TrueCrypt卷,这可能是因为TrueCrypt确保确保不保留任何元数据更改。我想确实有可能更改所返回的所有数据stat,因此不能保证可以对文件的每次可能修改都进行选择吗?


md5sum filename
拉梅什2014年

md5sum或任何类型的校验和读取文件的内容。我不想这样做,因为它对我来说太慢了。
DustByte 2014年

ls -t将按修改时间对目录中的内容进行排序。
ryekayo 2014年

“已修改”?每个文件都已被修改,问题是何时修改。您可以使用“查找”来搜索特定范围的修改时间。
雷·安德鲁斯

Answers:


5

如果要检测文件是否已通过常规方式进行了修改(在某些应用程序中对其进行编辑,从版本控制系统中检出新版本,对其进行重建等),请检查其修改时间(mtime)是否从最后检查。那就是stat -c %Y报告。

修改时间可以通过touch命令设置。如果要检测文件是否发生了任何更改(包括使用touch,提取档案等),请检查文件的inode更改时间(ctime)是否与上次检查相比已更改。那就是stat -c %Z报告。除非系统管理员可以伪造ctime(即使如此,也只能通过间接方式进行伪装:通过更改系统时钟或通过直接访问磁盘而不使用文件系统)。


谢谢,我认为应该使用ctime。并非出于我的问题,它的目的不是在我自己的备份脚本中使用它,在该脚本中,仅针对新文件或已更改的文件计算校验和。我可以为刚刚“稍微”更改的文件(例如权限已更改等)提供计算校验和的能力。我更喜欢与实际查看文件内容以确定更改的关系尽可能近。
DustByte

3

stat命令的分辨率只有一秒。因此,如果文件在同一秒内被修改了两次,则可能会错过修改。诸如ext4之类的较新文件系统提供了纳秒级的更高分辨率时间戳,但是一些旧工具尚未赶上。

另外,其他程序也可以设置任意修改时间。您可以通过touch命令查看如何发生这种情况。

如果您担心这两种可能性中的任何一种,那么查看文件大小也不是一个坏主意。这就是rsync在寻找修改后的文件时所做的事情。


1

我的感觉是,想要输入更多的参数来更加确定。

您拥有的是正确的方法。失败的唯一原因是文件系统更新不正确-在这种情况下,您将遇到许多更严重的问题。

当然,我假设某个人具有正确的知识,并且可以对可以访问该分区的系统进行root访问,从而可以更改信息,使其看起来好像文件没有被更改。但是,在这种情况下,他们一定会确保对大小等进行相同的操作。


0

我使指纹更详细。

我做了一个小的包装函数,可以为MacOS / BSD和GNU版本生成相同的输出stat(还可以检测到带有g前缀的Homebrew安装版本)。

init() {
  if command -v gstat > /dev/null; then
    # GNU coreutils with g prefix.
    statCmdArgs=("gstat" "--format=%n %s %b %u %g %i %h %Y %Z %W %o");
  elif ! stat --version > /dev/null 2> /dev/null; then
    # MacOS/BSD stat
    statCmdArgs=("stat" "-f" "%N %z %b %u %g %i %l %m %c %B %k");
  else
    # Assume GNU version without prefix.
    statCmdArgs=("stat" "--format=%n %s %b %u %g %i %h %Y %Z %W %o");
  fi;
}

getFileStatus() {
  "${statCmdArgs[@]}" "$1";
}

init函数在脚本初始化期间被调用一次,并且getFileStatus可以重复调用而不会产生检测开销。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.