3 votos

Encontrar y eliminar archivos duplicados en diferentes discos y directorios

Tengo cientos de miles de archivos distribuido en muchos discos duros externos y discos en equipos y muchos se duplican. Este desastre fue causado por mí mismo la creación de copias de seguridad propuesta. De momento he cambiado la estructura de directorios de mi organización, pero no se replica en otros lugares donde había copias.

Ahora, tengo una sola gran disco con casi todo lo que realmente necesito copias de seguridad y los reflejados en la nube.

Me gustaría que un camino para eliminar todo de todos los que se distribuyen los discos que ya está en el gran disco.

Permítanme mostrarles la scenarie:

OldDisk1:

/code/{manystructures}/{manyfiles}
/docs/{manystructures}/{manyfiles}

OldDisk2:

/dev/{another_structures}/{same_files_different_names}
/documents/{another_structures}/{same_files_different_names}

NewHugeDisk:

/home/username/code/{new_strutucture}/{new_files}
/home/username/documents/{new_strutucture}/{new_files}

Alguien sabe de una herramienta o de una manera de hacer algo parecido a "buscar todos los archivos en OldDisk1 que ya están en NewHugeDisk y eliminar"?

He mirado muchas herramientas (Windows, Mac y Linux, tengo este problema en ambos) gratis y pagado, pero no hubo suerte.

Y la idea sería crear un código para hacer eso, pero yo no soy un desarrollador. Puedo hacer un pequeño y sencillo códigos, pero este tipo de código, creo que sería complicado para mí.

Agradezco cualquier ayuda o alguna idea sobre esto.

2voto

flolilo Puntos 6

Suponiendo que usted puede usar Windows como un sistema operativo para todo el proceso y que no te gusta Gratis Buscador de Archivos Duplicados (nunca lo probé, pero lo encontramos mencionado aquí), podría usar PowerShell para lograr lo que se desea con relativamente poco esfuerzo. Nota: yo no soy un verdadero profesional en PowerShell, así que estoy bastante seguro de que se podría perfeccionar mi código.

Acaba de abrir Powershell ISE (o, si usted no tiene que utilizar el Bloc de notas), copie y pegue el siguiente código y guardar el archivo resultante en algún lugar *.ps1. Usted también tendrá que cambiar la $oldpath's y $newpath's valores a sus directorios - sólo hay que poner las rutas de acceso entre comillas.

# Search-and-Destroy-script
# Get all files of both code-directories:
$oldpath = "Disk1:\code"
$newpath = "DiskNew:\code"

$files_old = Get-ChildItem -Path $oldpath -Recurse -File
$files_new = Get-ChildItem -Path $newpath -Recurse -File

for($i=0; $i -lt $files_old.length; $i++){
    $j=0
    while($true){
        # if last edit time is the same and file-size is the same...
        if($($files_old[$i]).length -eq $($files_new[$j]).length -and $($files_old[$i]).lastWriteTime -eq $($files_new[$j]).lastWriteTime){
            # Get File-Hashes for those files (SHA1 should be enough)
            $files_old_hash = Get-FileHash -Path $($files_old[$i]).FullName -Algorithm SHA1 | ForEach-Object {$_.Hash}
            $files_new_hash = Get-FileHash -Path $($files_new[$j]).FullName -Algorithm SHA1 | ForEach-Object {$_.Hash}
            # if hashes also are the same...
            if($files_old_hash -eq $files_new_hash){
                # remove the old file (-Confirm can be removed so you don't have to approve for every file)
                # if you want to check the files before deletion, you could also just rename them (here we're adding the suffix ".DUPLICATE"
                # Rename-Item -Path $($files_old[$i]).FullName -NewName "$($files_old[$i]).Name.DUPLICATE"
                Remove-Item -Path $($files_old[$i]).FullName -Confirm
                Write-Host "DELETING`t$($files_old[$i]).FullName" -ForegroundColor Red
                break
            }
        # if files aren't the same...
        }else{
            # if old_file is compared to all new_files, check next old file
            if($j -ge $files_new.length){
                break
            }
        }
        $j++
    }
}

A continuación, iniciar la secuencia de comandos (a través del botón derecho del mouse, por ejemplo) - si eso no funciona, asegúrese de que su ExecutionPolicy (https://superuser.com/a/106363/703240).

Yo uso casi de la misma secuencia de comandos para comprobar los archivos que se han copiado ya (pero posiblemente con cambiado los nombres). Este código supone que sólo los nombres de los archivos son diferentes, pero no el contenido. La última edición de tiempo por lo general permanece la misma, incluso después de copiar un archivo a un nuevo camino, a diferencia del momento de la creación. Si el contenido es diferente, mi solución no mal - podría usar únicos y diferentes atributos de los archivos (pero que?) o estado que, por ejemplo, sólo los archivos de tat son menores de edad o más (teniendo en cuenta el momento de la edición, de nuevo) de los nuevos archivos deben ser eliminados.

Lo que hace el script:

  1. Conseguir todos los archivos en las carpetas especificadas (y sus subcarpetas)
  2. obteniendo los primeros archivo antiguo (especificado por $i)...
  3. comparando su último momento de la edición y su tamaño con el de la primer archivo nuevo (especificado por $j)...
  4. ...si son iguales, se calcula un archivo de hash para estar seguro de que definitivamente es el mismo archivo (probablemente, esto podría ser un poco demasiado mucho esfuerzo para que su objetivo)
  5. si hashes son iguales, el antiguo archivo se elimina (y que va a escribir el archivo en el terminal) y luego comenzar de nuevo en la 2. con el siguiente archivo antiguo...
  6. si los hash no son iguales (o la última edición de veces no igual o tamaños de archivos no igual) que se inicia de nuevo a las 3. con el siguiente archivo nuevo.

0voto

user8010482 Puntos 1

¿Has probado usando el software de deduplicación de terceros?
He probado desduplicación de zarzamora y es muy eficiente como:

  • tiene su propio mecanismo de dedup para eliminar datos duplicados ahorrando mucho espacio de almacenamiento.
  • Otra ventaja de estas herramientas es que son más fiables y tienen una técnica de gestión de recursos dedicados.

EnMiMaquinaFunciona.com

EnMiMaquinaFunciona es una comunidad de administradores de sistemas en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros sysadmin, hacer tus propias preguntas o resolver las de los demás.

Powered by: