我试图从文件系统中删除重复文件,其中有大约12,000个体面大小(150+ MB)的文件。我希望套装中有20-50个重复。
我的想法是建立一个列出每个文件及其文件大小的散列,而不是对每个文件及其文件大小进行校验,而不是对每个文件进行校验和,消除文件大小唯一的条目,并且只对余数进行校验和,节省很多时候。
但是我在将哈希传递到唯一条目时遇到了一些麻烦。我试过,其中files
是类似super_cool_map.png => 1073741824,
的哈希:
uniques = files.values.uniq
dupes = files.delete_if do |k,v|
uniques.include?(v)
end
puts dupes
但是只输出一个空白哈希。我该怎么办?
答案 0 :(得分:2)
这是怎么回事?
# this will give the grouped same size files as an array.
files.group_by(&:last).map { |_, v| v.map(&:first) if v.size > 1 }.compact
答案 1 :(得分:2)
为什么不反转映射?使密钥为文件大小,值为list
文件名。这样你就可以免费获得“按大小分组”。
然后您可以使用
过滤哈希值my_hash = {30323 => ["file1", "file2"], 233 => ["file3"]}
filtered = my_hash.select{ |k, v|
v.size > 1
}
p filtered # prints {30323 => ["file1", "file2"]}
现在你有一个散列,其中每个键对应一个你需要散列并相互比较的文件列表。