Non puoi selezionare più di 25 argomenti Gli argomenti devono iniziare con una lettera o un numero, possono includere trattini ('-') e possono essere lunghi fino a 35 caratteri.
 
 
 
 

62 righe
1.4 KiB

  1. #!/usr/bin/env ruby
  2. #
  3. # Quick script to find duplicate files
  4. #
  5. require 'find'
  6. require 'digest/sha1'
  7. require 'set'
  8. hashes = Hash.new
  9. start = ARGV[0] || ENV["HOME"]
  10. puts "Building digests from #{start}"
  11. Find.find(start) do |path|
  12. STDOUT.flush
  13. this_hash = Set.new
  14. hash = "NONE"
  15. if (FileTest.directory?(path) or FileTest.symlink?(path)\
  16. or FileTest.blockdev?(path) or FileTest.chardev?(path)\
  17. or FileTest.socket?(path) or FileTest.pipe?(path)\
  18. or FileTest.zero?(path)) then
  19. next
  20. else
  21. begin
  22. file_digest = Digest::SHA1.new
  23. File.open(path, 'r') do |fh|
  24. while buffer = fh.read(8096)
  25. file_digest.update(buffer)
  26. end
  27. end
  28. hash = file_digest.hexdigest
  29. rescue NoMemoryError
  30. puts "NoMemoryError on #{path}"
  31. GC.start
  32. rescue IOError
  33. puts "IOError on #{path}"
  34. GC.start
  35. rescue Errno::ENOSYS; next
  36. rescue Errno::EACCES; next
  37. rescue Errno::EINVAL; next
  38. rescue => e
  39. puts "Unhandled error on #{path}, exception #{e}"
  40. p e
  41. exit 255
  42. end
  43. end
  44. if (hashes[hash]) then
  45. hashes[hash].add(path)
  46. else
  47. hashes[hash] = this_hash.add(path)
  48. end
  49. end
  50. puts "Digest generation complete."
  51. hashes.each_pair do |key, val|
  52. files = val.to_a
  53. files.delete(nil)
  54. files.delete_if {|x| "#{x}" =~ /^\s*$/}
  55. next if (files.size < 2)
  56. puts "Duplicate digest <#{key}> for files:\n #{files.join("\n ")}"
  57. end