4

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

它发生变化或发生了什么变化时,我不需要被通知。我只需要一种方法来检查它是否已经改变。

4

3 回答 3

2

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

touch time_marker

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

find . -newer time_marker

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

于 2013-10-31T17:12:38.093 回答
1

If you just need to know if names have changed or files have been added/removed, you can try this:

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

Just store and compare the hash values. You can obviously go further by getting more information out of a call to ls, for example, or out of File objects that represent each of the files in your directory structure, and hashing that.

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

UM ACTUALLY I'm being dumb and hash is only consistent for any one runtime environment of ruby. Let's use the standard Zlib::crc32 instead, e.g.

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

My concern is that this approach will be memory-hungry and slow if you're checking a very large filesystem. Perhaps globbing the entire structure and mapping it isn't the way--if you have a lot of subdirectories you could walk them recursively and calculate a checksum for each, then combine the checksums.

This might be better for larger directories:

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

This would be less prone to collisions:

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
于 2013-10-31T17:04:07.787 回答
0

我已对此进行了修改,以包括时间戳和文件大小。

dir_checksum = Zlib::crc32(Dir.glob(
  File.join(dispatch, '/**/*')).map { |path|
    path.to_s + "_" + File.mtime(path).to_s + "_" + File.size(path).to_s
  }.to_s)

于 2021-12-20T00:01:02.953 回答