如何检查一个目录是否在给定时间点后其内容发生了变化?
我不需要得到变化的具体信息,只需要确认它是否发生了变化。
touch time_marker
当您想要检查是否添加了任何内容时,请使用以下方式进行“查找”:
find . -newer time_marker
这将只告诉你自从创建time_marker以来修改或添加的文件 - 它不会告诉你是否删除了任何内容。如果您想在未来再次查看,请再次“touch” time_marker以创建新的参考点。
Dir.glob('some_directory/**/*').hash
只需存储和比较哈希值。你可以通过调用ls
或者使用代表目录结构中每个文件的File对象来获取更多信息,并对其进行哈希处理。
Dir.glob('some_directory/**/*').map { |name| [name, File.mtime(name)] }.hash
其实我太蠢了,哈希只对 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
Dir.glob('some_directory/**/*').map { |name| [name, File.mtime(name)] }.hash
,每次都会得到相同的值。但是,如果我关闭IRB,重新打开并再次执行相同的操作,我会得到一个不同的值(同样是重复的)。 - Undistraction我已经修改了这个程序,加入了时间戳和文件大小。
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)
mtime
吗? - Undistraction