¿Cómo reemplazar todos los archivos duplicados con enlaces duros?

20

Tengo dos carpetas que contienen varios archivos. Algunos de los archivos de la primera carpeta tienen una copia exacta en la segunda carpeta. Me gustaría reemplazar aquellos con un enlace duro. ¿Cómo puedo hacer eso?

qdii
fuente
2
Proporcione el sistema operativo y el sistema de archivos.
Steven
Bueno, uso ext4 en ubuntu 15.04, pero si alguien proporciona una respuesta para otro sistema operativo, estoy seguro de que puede ser útil para alguien que lea esta pregunta.
qdii
He aquí una pregunta duplicado en Unix.SE .
Alexey

Respuestas:

20

Sé de 4 soluciones de línea de comandos para Linux. Mi preferido es el último enumerado aquí rdfind, debido a todas las opciones disponibles.

fdupes

  • Este parece ser el más recomendado / más conocido.
  • Es el más simple de usar, pero su única acción es eliminar duplicados.
  • Para garantizar que los duplicados sean en realidad duplicados (aunque no se ejecutan para siempre), las comparaciones entre archivos se realizan primero por tamaño de archivo, luego hash md5, luego comparación bye por byte.

Salida de muestra (con las opciones "mostrar tamaño", "recursivo"):

$ fdupes -Sr .
17 bytes each:                          
./Dir1/Some File
./Dir2/SomeFile

enlace duro

  • Diseñado para, como su nombre lo indica, reemplazar los archivos encontrados con enlaces duros.
  • Tiene una --dry-runopción.
  • No indica cómo se comparan los contenidos, pero a diferencia de todas las demás opciones, tiene en cuenta el modo de archivo, el propietario y el tiempo modificado.

Ejemplo de salida (observe cómo mis dos archivos tienen tiempos de modificación ligeramente diferentes, por lo que en la segunda ejecución le digo que ignore eso):

$ stat Dir*/* | grep Modify
Modify: 2015-09-06 23:51:38.784637949 -0500
Modify: 2015-09-06 23:51:47.488638188 -0500

$ hardlink --dry-run -v .
Mode:     dry-run
Files:    5
Linked:   0 files
Compared: 0 files
Saved:    0 bytes
Duration: 0.00 seconds

$ hardlink --dry-run -v -t .
[DryRun] Linking ./Dir2/SomeFile to ./Dir1/Some File (-17 bytes)
Mode:     dry-run
Files:    5
Linked:   1 files
Compared: 1 files
Saved:    17 bytes
Duration: 0.00 seconds

sin valor

  • Hecho para encontrar archivos sobre los que el usuario actúa; no tiene acciones disponibles.
  • Las comparaciones se realizan por tamaño de archivo, luego sha1 hash.
    • El hash se puede cambiar a sha256, sha384 o sha512.
    • Hash se puede deshabilitar para hacer una comparación byte por byte

Salida de muestra (con la opción "recursiva"):

$ duff -r .
2 files in cluster 1 (17 bytes, digest 34e744e5268c613316756c679143890df3675cbb)
./Dir2/SomeFile
./Dir1/Some File

rdfind

  • Las opciones tienen una sintaxis inusual (¿destinada a imitar find?).
  • Varias opciones de acciones para realizar en archivos duplicados (eliminar, crear enlaces simbólicos, crear enlaces duros).
  • Tiene un modo de funcionamiento en seco.
  • Las comparaciones se realizan por tamaño de archivo, luego primeros bytes, luego últimos bytes, luego md5 (predeterminado) o sha1.
  • La clasificación de los archivos encontrados hace que sea predecible qué archivo se considera original.

Salida de muestra:

$ rdfind -dryrun true -makehardlinks true .
(DRYRUN MODE) Now scanning ".", found 5 files.
(DRYRUN MODE) Now have 5 files in total.
(DRYRUN MODE) Removed 0 files due to nonunique device and inode.
(DRYRUN MODE) Now removing files with zero size from list...removed 0 files
(DRYRUN MODE) Total size is 13341 bytes or 13 kib
(DRYRUN MODE) Now sorting on size:removed 3 files due to unique sizes from list.2 files left.
(DRYRUN MODE) Now eliminating candidates based on first bytes:removed 0 files from list.2 files left.
(DRYRUN MODE) Now eliminating candidates based on last bytes:removed 0 files from list.2 files left.
(DRYRUN MODE) Now eliminating candidates based on md5 checksum:removed 0 files from list.2 files left.
(DRYRUN MODE) It seems like you have 2 files that are not unique
(DRYRUN MODE) Totally, 17 b can be reduced.
(DRYRUN MODE) Now making results file results.txt
(DRYRUN MODE) Now making hard links.
hardlink ./Dir1/Some File to ./Dir2/SomeFile
Making 1 links.

$ cat results.txt 
# Automatically generated
# duptype id depth size device inode priority name
DUPTYPE_FIRST_OCCURRENCE 1 1 17 2055 24916405 1 ./Dir2/SomeFile
DUPTYPE_WITHIN_SAME_TREE -1 1 17 2055 24916406 1 ./Dir1/Some File
# end of file
Izkata
fuente
1
"entonces md5 (predeterminado) o sha1". Eso no significa que los archivos sean idénticos. Dado que calcular un hash requiere que el programa lea el archivo completo de todos modos, solo debe comparar los archivos completos byte por byte. También ahorra tiempo de CPU.
endolito el
@endolith Es por eso que siempre comienzas con la prueba en seco, para ver qué pasaría ...
Izkata
1
Pero el objetivo del software es identificar archivos duplicados para usted. Si tiene que verificar manualmente que los archivos estén realmente duplicados, entonces no es bueno.
endolito
2
Si tiene n archivos con idéntico tamaño, primeros bytes y bytes finales, pero todos son diferentes, ¡determinar que por comparación directa requiere n ! comparaciones de pares. Es probable que compartirlos todos y luego comparar hash sea mucho más rápido, especialmente para archivos grandes y / o grandes cantidades de archivos. Cualquiera que pase ese filtro puede pasar a hacer comparaciones directas para verificar. (O simplemente use un mejor hash para comenzar.)
Alan De Smet
6

Duplicate Commander es una posible solución en Windows:

Duplicate Commander es una aplicación gratuita que te permite encontrar y administrar archivos duplicados en tu PC. Duplicate Commander viene con muchas características y herramientas que le permiten recuperar su espacio en disco de esos duplicados.

caracteristicas:

Replacing files with hard links
Replacing files with soft links
... (and many more) ...

1

Para Linux, puede encontrar un script Bash aquí .

Karan
fuente
2

Duplicate & Same File Searcher es otra solución más en Windows:

Duplicate & Same Files Searcher (Duplicate Searcher) es una aplicación para buscar archivos duplicados (clones) y enlaces duros NTFS al mismo archivo. Busca contenidos de archivos duplicados sin importar el nombre del archivo (se utiliza la comparación verdadera byte a byte). Esta aplicación permite no solo eliminar archivos duplicados o moverlos a otra ubicación, sino también reemplazar duplicados con enlaces duros NTFS (¡único!)

ingrese la descripción de la imagen aquí

Greck
fuente
1

Tenía una ingeniosa herramienta gratuita en mi computadora llamada Link Shell Extension; no solo fue genial para crear enlaces duros y enlaces simbólicos, ¡sino también Junctions! Además, agregó iconos personalizados que le permiten identificar fácilmente diferentes tipos de enlaces, incluso los que ya existían antes de la instalación; Las flechas rojas representan enlaces duros, por ejemplo, mientras que las verdes representan enlaces simbólicos ... y las cadenas representan uniones.

Desafortunadamente, desinstalé el software hace un tiempo (en una desinstalación masiva de varios programas), por lo que no puedo crear más enlaces manualmente, pero los íconos aún aparecen automáticamente cada vez que Windows detecta un enlace duro, simbólico o de unión.

Amaroq Starwind
fuente
1

Recomiendo jdupes . Es una bifurcación mejorada de fdupes , pero también incluye:

  • Un montón de nuevas opciones de línea de comandos, incluyendo --linkhard, o -Lpara abreviar
  • soporte nativo para todas las principales plataformas de SO
  • Se dice que la velocidad es más de 7 veces más rápida que los fdupes en promedio

Para su pregunta, simplemente puede ejecutar $ jdupes -L /path/to/your/files.

Es posible que desee clonar y construir la última fuente de su repositorio de GitHub ya que el proyecto aún está en desarrollo activo. Los binarios de Windows también se proporcionan aquí. Los binarios empaquetados están disponibles en algunas distribuciones de Linux / BSD, en realidad lo encontré por primera vez $ apt search.

Arnie97
fuente