2014-06-05 10 views
0

크기가 약 12,000 (150MB 이상) 인 파일 시스템에서 중복 파일을 제거하려고합니다. 나는 세트에서 20-50 개의 중복을 기대한다.해시에 중복 항목을 나열하려면 어떻게합니까?

비교적 까다로운 모든 단일 파일에 대한 체크섬 대신 모든 파일과 해당 파일 크기를 나열하는 해시를 작성하고 파일 크기가 고유 한 항목을 제거하고 나머지는 체크섬 만 수행하고, 많은 시간을 절약 할 수 있습니다.

그러나 고유 항목 만 해시를 제거하는 데 문제가 있습니다. 나는 filessuper_cool_map.png => 1073741824, 같은 해시이고, 시도 :

uniques = files.values.uniq 
dupes = files.delete_if do |k,v| 
    uniques.include?(v) 
end 
puts dupes 

는하지만 그것은 단지 빈 해시를 출력합니다. 어떻게해야합니까?

+1

일부 데이터 입력을 제공하므로 결과를 단계적으로 보여줄 수 있습니다. –

+0

@ArupRakshit 귀하의 답변은 정상입니다. 나는'flat_map' 대신에'map'을 사용하는 것이 더 유용하다고 생각합니다. 이것은 그룹 배열에 속을 유지합니다. – Candide

답변

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 
2

왜 매핑을 바꾸지 않습니까? 키에 파일 크기를 지정하고 파일 이름에 list 값을 지정하십시오. 그렇게하면 무료로 크기별로 그룹화 할 수 있습니다.

그럼 당신은 지금 당신이 파일의 목록에 각 키에 대응하면 해시 서로 비교해야 해시가

my_hash = {30323 => ["file1", "file2"], 233 => ["file3"]} 

filtered = my_hash.select{ |k, v| 
    v.size > 1 
} 

p filtered # prints {30323 => ["file1", "file2"]} 

를 사용하여 해시를 필터링 할 수 있습니다.

관련 문제