目录内容是否已更改?

时间:2013-10-31 16:56:11

标签: ruby macos file directory

如何检查目录以查看自给定时间点以来其内容是否已更改?

更改时, 更改时,我无需通知。我只需要一种方法来检查如果它已经改变了。

2 个答案:

答案 0 :(得分:1)

如果您只是需要知道名称是否已更改或文件是否已添加/删除,您可以尝试:

Dir.glob('some_directory/**/*').hash

只需存储并比较哈希值。显然,您可以通过调用ls或从表示目录结构中每个文件的文件对象中获取更多信息并进行散列来进一步获取更多信息。

Dir.glob('some_directory/**/*').map { |name| [name, File.mtime(name)] }.hash

UM实际上我是愚蠢的,哈希只对任何一个ruby的运行时环境都是一致的。我们改用标准Zlib::crc32,例如

Zlib::crc32(Dir.glob('some_directory/**/*').map { |name| [name, File.mtime(name)] }.to_s)

我担心的是,如果你正在检查一个非常大的文件系统,这种方法会占用大量内存并且速度很慢。也许全局结构并映射它不是方法 - 如果你有很多子目录,你可以递归地遍历它们并为每个子目标计算校验和,然后组合校验和。

对于较大的目录,这可能更好:

Dir.glob('some_directory/**/*').map do |name| 
  s = [name, File.mtime(name)].to_s
  [Zlib::crc32(s), s.length]
end.inject(Zlib::crc32('')) do |combined, x| 
  Zlib::crc32_combine(combined, x[0], x[1])
end

这不太容易发生碰撞:

Dir.glob('some_directory/**/*').map do |name| 
  [name, File.mtime(name)].to_s
end.inject(Digest::SHA512.new) do |digest, x| 
  digest.update x
end.to_s

答案 1 :(得分:1)

使用您喜欢的任何方法在您希望开始监控的时间点创建一个文件,例如:

touch time_marker

然后,当您想要检查是否添加了任何内容时,请使用“find”,如下所示:

find . -newer time_marker

这只会告诉您自创建time_marker以来已修改或添加的文件 - 它不会告诉您是否已删除任何内容。如果您想再次查看未来的点,请再次“触摸”time_marker以创建新的参考点。