如果您只需要知道名称是否已更改或文件是否已添加/删除,您可以试试这个:
Dir.glob('some_directory/**/*').hash
只需存储和比较哈希值。显然,您可以通过调用 ls 或从代表目录结构中每个文件的 File 对象中获取更多信息并对其进行散列处理,从而更进一步。
Dir.glob('some_directory/**/*').map { |name| [name, File.mtime(name)] }.hash
UM ACTUALLY 我很笨,哈希仅对任何一个 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