[Ruby] [APORTE] FINDUS (Find Duplicates)

Iniciado por Eleкtro, 14 Abril 2012, 17:58 PM

0 Miembros y 1 Visitante están viendo este tema.

Eleкtro



Esta utilidad busca archivos duplicados comprobando el hash CRC32.

Citar
  • Modo de empleo:
              FINDUS [OPCIONES] [RUTA]

  • Opciones:
       [-R]  Habilita la búsqueda recursiva de subdirectorios.

  • Ejemplos:
              FINDUS "%CD%"
              FINDUS -R "C:\Windows"


Código (ruby) [Seleccionar]
# -*- coding: UTF-8 -*-

require "zlib"
exit if Object.const_defined?(:Ocra)

def logo()
print '

  _______   __     _____  ___    ________    ____  ____    ________  
 /"     "| |" \\   (\\"   \\|"  \\  |"      "\\  ("  _||_ " |  /"       )
(: ______) ||  |  |.\\\\   \\    | (.  ___  :) |   (  ) : | (:   \\___/  
 \\/    |   |:  |  |: \\.   \\\\  | |: \\   ) || (:  |  | . )  \\___  \\    
 // ___)   |.  |  |.  \\    \\. | (| (___\\ ||  \\\\ \\__/ //    __/  \\\\  
(:  (      /\\  |\\ |    \\    \\ | |:       :)  /\\\\    //\\   /" \\   :)  
 \\__/     (__\\_|_) \\___|\\____\\) (________/      \\__/     (_______/  

          Find Duplicates v1.0       By Elektro H@cker

'
end

def help()
print '
Este programa busca archivos duplicados comprobando el hash CRC32.

[*] Modo de empleo:

    FINDUS [OPCIONES] [RUTA]

[*] Opciones:

    [-R]  Habilita la búsqueda recursiva en subdirectorios.

[*] Ejemplos:

    FINDUS "%CD%"
    FINDUS -R "C:\Windows"

'
Process.exit
end

def errorcontrol()
 if ARGV.empty?
   help
 elsif ARGV.length == 2 and not File.directory? (ARGV[1])
   help
 elsif ARGV.length == 1 and not File.directory? (ARGV[0])
   help
 end
 if ARGV[0] =~ /-r/i
   $folder = ARGV[1]
   Dir.chdir($folder)
   resursive = File.join("**", "*.*")
   $files = Dir.glob(resursive)
 elsif
   $folder = ARGV[0]
   Dir.chdir($folder)
   not_resursive = File.join("*.*")
   $files = Dir.glob(not_resursive)
 end
end

logo
errorcontrol
$list = ""

# Listar los archivos del directorio
File.open("#{ENV['TEMP']}\\dir.txt", 'w+') do |file|  
file.puts $files
end

# Comparar el crc de cada archivo listado
File.read("#{ENV['TEMP']}\\dir.txt").each_line { |line|
begin
 file      = File.read(line.strip) ; nil
 file_crc  = Zlib.crc32(file,0).to_s(16)
 file_size = File.size(line.strip)
  if $list[file_crc.to_s]
    print "#{$folder}\\#{line.strip.gsub('/', '\\')}\n#{$list.split(file_crc).first.split(")").last.split("\n\n").last}#{file_crc})\n\n"
  end
 $list << "#{$folder}\\#{line.strip.gsub('/', '\\')}\n(CRC32: #{file_crc}) (BYTES: #{file_size})\n\n"
rescue
 print "Archivo inaccesible #{$folder}\\#{line}"
end
}


__END__


PD: Tiene algunos fallos en los permisos de las carpetas especiales de windows

Saludos.