it-swarm-es.tech

¿Hay una manera fácil de reemplazar archivos duplicados con enlaces duros?

Estoy buscando una manera fácil (un comando o una serie de comandos, que probablemente involucre find) para encontrar archivos duplicados en dos directorios y reemplazar los archivos en un directorio con enlaces duros de los archivos en el otro directorio.

Aquí está la situación: este es un servidor de archivos en el que varias personas almacenan archivos de audio, cada usuario tiene su propia carpeta. A veces, varias personas tienen copias de los mismos archivos de audio. En este momento, estos son duplicados. Me gustaría hacerlo para que sean enlaces duros, para ahorrar espacio en el disco duro.

146
Josh

Hay un script de Perl en http://cpansearch.Perl.org/src/ANDK/Perl-Repository-APC-2.002/eg/trimtrees.pl que hace exactamente lo que desea:

Recorre todos los directorios nombrados en la línea de comando, calcula sumas de comprobación MD5 y busca archivos con MD5 idéntico. Si son iguales, haga una comparación real si son realmente iguales, reemplace el segundo de dos archivos con un enlace rígido al primero.

42
fschmitt

rdfind hace exactamente lo que pides (y en el orden johny why enumera). Permite eliminar duplicados, reemplazarlos con enlaces blandos o duros. Combinado con symlinks también puede hacer que el enlace simbólico sea absoluto o relativo. Incluso puede elegir el algoritmo de suma de verificación (md5 o sha1).

Como está compilado, es más rápido que la mayoría de las soluciones con script: time en una carpeta 15 GiB con 2600 archivos en mi Mac Mini desde 2009 devuelve esto

9.99s user 3.61s system 66% cpu 20.543 total

(usando md5).

Disponible en la mayoría de los controladores de paquetes (por ejemplo, MacPorts para Mac OS X).

98
d-b

Use la herramienta fdupes:

fdupes -r /path/to/folder le da una lista de duplicados en el directorio (-r lo hace recursivo). El resultado se ve así:


nombre de archivo1
nombre de archivo2

filename3
nombre de archivo4
nombre de archivo5


con filename1 y filename2 son idénticos y filename3, filename4 y filename5 también son idénticos.

51
tante
24
waltinator

Esta es una de las funciones proporcionadas por "fslint" - http://en.flossmanuals.net/FSlint/Introduction

Haga clic en el botón "Fusionar":

Screenshot

18
LJ Wobker

Como su objetivo principal es ahorrar espacio en el disco, existe otra solución: la desduplicación (y probablemente la compresión) en el nivel del sistema de archivos. En comparación con la solución de enlace duro, no tiene el problema de afectar inadvertidamente a otros archivos vinculados.

ZFS tiene dedup (nivel de bloque, no nivel de archivo) desde la versión 23 del grupo y compresión desde hace mucho tiempo. Si está utilizando Linux, puede intentar zfs-Fuse , o si usa BSD, es compatible de forma nativa.

14
Wei-Yin

En Linux moderno en estos días hay https://github.com/g2p/bedup que se desduplica en un sistema de archivos btrfs, pero 1) sin tanta sobrecarga de escaneo, 2) los archivos pueden divergir fácilmente de nuevo luego.

7
Matthew Bloch
aptitude show hardlink

Descripción: enlaces múltiples copias del mismo archivo Hardlink es una herramienta que detecta múltiples copias del mismo archivo y las reemplaza por enlaces duros.

La idea ha sido tomada de http://code.google.com/p/hardlinkpy/ , pero el código ha sido escrito desde cero y con licencia bajo el MIT licencia. Página de inicio: http://jak-linux.org/projects/hardlink/

6
Julien Palard

Para buscar archivos duplicados, puede usar duff.

Duff es una utilidad de línea de comandos de Unix para encontrar rápidamente duplicados en un conjunto de archivos dado.

Simplemente ejecute:

duff -r target-folder

Para crear enlaces duros a esos archivos automáticamente, deberá analizar la salida de duff con bash o alguna otra secuencia de comandos idioma.

6
Stefan

He usado muchas de las herramientas de hardlinking para Linux mencionadas aquí. Yo también estoy atrapado con ext4 fs, en Ubuntu, y he estado usando su cp -l y - s para hard/softlinking. Pero últimamente noté el copia ligera en la página del manual cp, lo que implicaría ahorrar espacio en disco redundante hasta un lado se modifica:

   --reflink[=WHEN]
          control clone/CoW copies. See below

       When  --reflink[=always]  is specified, perform a lightweight copy, where the 
data blocks are copied only when modified.  If this is not possible the
       copy fails, or if --reflink=auto is specified, fall back to a standard copy.
4
Marcos

jdupes se ha mencionado en un comentario, pero merece su propia respuesta, ya que probablemente esté disponible en la mayoría de las distribuciones y se ejecute bastante rápido (solo liberó 2.7GB de una partición completa de 98GB de 158GB (unidad SSD) en aproximadamente un minuto) :

jdupes -rL /foo/bar

Me parece que verificar el nombre del archivo primero podría acelerar las cosas. Si dos archivos carecen del mismo nombre de archivo, en muchos casos no los consideraría duplicados. Parece que el método más rápido sería comparar, en orden:

  • nombre del archivo
  • talla
  • suma de comprobación md5
  • contenido de bytes

¿Algún método hace esto? Mire duff, fdupes, rmlint, fslint, etc.

El siguiente método fue el más votado commandlinefu.com : Buscar archivos duplicados (basado primero en el tamaño, luego hash MD5)

¿Se puede agregar la comparación de nombre de archivo como primer paso, el tamaño como segundo paso?

find -not -empty -type f -printf "%s\n" | sort -rn | uniq -d | \
  xargs -I{} -n1 find -type f -size {}c -print0 | xargs -0 md5sum | \
  sort | uniq -w32 --all-repeated=separate
4
johny why

Como no soy fanático de Perl, aquí hay una versión bash:

#!/bin/bash

DIR="/path/to/big/files"

find $DIR -type f -exec md5sum {} \; | sort > /tmp/sums-sorted.txt

OLDSUM=""
IFS=$'\n'
for i in `cat /tmp/sums-sorted.txt`; do
 NEWSUM=`echo "$i" | sed 's/ .*//'`
 NEWFILE=`echo "$i" | sed 's/^[^ ]* *//'`
 if [ "$OLDSUM" == "$NEWSUM" ]; then
  echo ln -f "$OLDFILE" "$NEWFILE"
 else
  OLDSUM="$NEWSUM"
  OLDFILE="$NEWFILE"
 fi
done

Esto busca todos los archivos con la misma suma de comprobación (ya sean enlaces grandes, pequeños o ya con enlaces duros) y los une entre sí.

Esto se puede optimizar en gran medida para ejecuciones repetidas con marcas de búsqueda adicionales (por ejemplo, tamaño) y un caché de archivos (para que no tenga que rehacer las sumas de verificación cada vez). Si alguien está interesado en la versión más inteligente y más larga, puedo publicarla.

NOTA: Como se mencionó anteriormente, los enlaces duros funcionan siempre y cuando los archivos nunca necesiten modificación o para moverse a través de los sistemas de archivos.

3
seren

Si desea reemplazar duplicados por enlaces duros en mac o cualquier sistema basado en UNIX, puede probar SmartDupe http://sourceforge.net/projects/smartdupe/ lo estoy desarrollando

1
islam

Hice un script de Perl que hace algo similar a lo que estás hablando:

http://Pastebin.com/U7mFHZU7

Básicamente, solo atraviesa un directorio, calculando la suma SHA1 de los archivos en él, dividiéndolo en hash y vinculando las coincidencias. Ha sido útil en muchas, muchas ocasiones.

1
amphetamachine

Las aplicaciones FSLint ( http://www.pixelbeat.org/fslint/ ) pueden encontrar todos los archivos iguales en cualquier carpeta (por contenido) y crear enlaces duros. ¡Darle una oportunidad!

Jorge Sampaio

1

Los enlaces duros pueden no ser la mejor idea; Si un usuario cambia el archivo, afecta a ambos. Sin embargo, eliminar un enlace duro no elimina ambos archivos. Además, no estoy completamente seguro de que los enlaces duros ocupen la misma cantidad de espacio (en el disco duro, no en el sistema operativo) que varias copias del mismo archivo; según Windows (con la extensión Link Shell), lo hacen. De acuerdo, eso es Windows, no Unix ...

Mi solución sería crear un archivo "común" en una carpeta oculta y reemplazar los duplicados reales con enlaces simbólicos ... luego, los enlaces simbólicos se incrustarían con metadatos o secuencias de archivos alternativas que solo registran los dos "archivos" son diferentes entre sí, como si una persona quiere cambiar el nombre del archivo o agregar una carátula personalizada o algo así; incluso podría ser útil fuera de las aplicaciones de bases de datos, como tener instaladas varias versiones del mismo juego o software y probarlas de forma independiente, incluso con las más pequeñas diferencias.

0
Amaroq Starwind

Si va a hacer enlaces duros, preste atención a los derechos en ese archivo. Aviso, propietario, grupo, modo, atributos extendidos, tiempo y ACL (si usa esto) se almacenan en INODE. Solo los nombres de archivo son diferentes porque esto se almacena en la estructura del directorio y otros puntos a las propiedades INODE. Esta causa, todos los nombres de archivo vinculados al mismo inodo, tienen los mismos derechos de acceso. Debe evitar la modificación de ese archivo, porque cualquier usuario puede dañar el archivo a otro. Es simple. Es suficiente, cualquier usuario pone otro archivo con el mismo nombre. El número de inoode se guarda y el contenido del archivo original se destruye (reemplaza) para todos los nombres enlazados.

La mejor manera es la deduplicación en la capa del sistema de archivos. Puede usar BTRFS (muy popular la última vez), OCFS o de esta manera. Mire la página: https://en.wikipedia.org/wiki/Comparison_of_file_systems , especialmente en la tabla Características y deduplicación de datos de columna. Puedes hacer clic y ordenar :)

Mire especialmente al sistema de archivos ZFS. Está disponible como Fuse, pero de esta manera es muy lento. Si desea soporte nativo, mire la página http://zfsonlinux.org/ . Luego debe parchear el kernel y luego instalar las herramientas zfs para la administración. No entiendo, por qué Linux no es compatible como controladores, es la forma para muchos otros sistemas operativos/núcleos.

Los sistemas de archivos admiten la deduplicación de 2 formas, deduplicar archivos o bloques. ZFS admite bloque. Esto significa que los mismos contenidos que se repiten en el mismo archivo pueden deduplicarse. Otra forma es cuando los datos se deduplican, esto puede ser en línea (zfs) o fuera de línea (btrfs).

Aviso, la deduplicación consume RAM. Esta es la razón por la cual escribir archivos en un volumen ZFS montado con Fuse, causa un rendimiento dramáticamente lento. Esto se describe en la documentación. Pero en línea puede activar/desactivar la deduplicación en volumen. Si ve que algún dato debe deduplicarse, simplemente active la deduplicación, reescriba algún archivo en cualquier temporal y finalmente reemplácelo. después de esto, puede desactivar la deduplicación y restaurar el rendimiento completo. Por supuesto, puede agregar al almacenamiento cualquier disco de caché. Esto puede ser discos de rotación muy rápidos o discos SSD. Por supuesto, esto puede ser discos muy pequeños. En el trabajo real, este es el reemplazo de RAM :)

En Linux, debe tener cuidado con ZFS porque no todo funciona como debería, especialmente cuando administra el sistema de archivos, toma una instantánea, etc., pero si realiza la configuración y no la cambia, todo funciona correctamente. De otra manera, debe cambiar Linux a opensolaris, es compatible de forma nativa con ZFS :) Lo que es muy bueno con ZFS es que funciona tanto como sistema de archivos como administrador de volumen similar a LVM. No lo necesita cuando usa ZFS. Consulte la documentación si desea saber más.

Observe la diferencia entre ZFS y BTRFS. ZFS es más antiguo y más maduro, desafortunadamente solo bajo Solaris y OpenSolaris (desafortunadamente estrangulado por Oracle). BTRFS es más joven, pero la última vez es muy bueno. Recomiendo kernel fresco. ZFS tiene deduplicación en línea, lo que causa ralentizaciones de escritura, porque todo se calcula en línea. BTRFS admite deduplicación fuera de línea. Entonces esto ahorra rendimiento, pero cuando Host no tiene nada que hacer, ejecuta periódicamente la herramienta para realizar la deduplicación. Y BTRFS se crea de forma nativa en Linux. Tal vez esto sea mejor FS for You :)

0
Znik

La forma más fácil es usar el programa especial dupeGuru

dupeGuru Preferences Screenshot

como documentación dice

Opciones de borrado

Estas opciones afectan cómo se lleva a cabo la eliminación duplicada. La mayoría de las veces, no necesita habilitar ninguno de ellos.

Vincular archivos eliminados:

Los archivos eliminados se reemplazan por un enlace al archivo de referencia. Tiene la opción de reemplazarlo con un enlace simbólico o un enlace duro. ... un enlace simbólico es un acceso directo a la ruta del archivo. Si el archivo original se elimina o se mueve, el enlace está roto. Un enlace duro es un enlace al archivo en sí. Ese enlace es tan bueno como un archivo "real". Solo cuando se eliminan todos los enlaces duros a un archivo, se elimina el archivo mismo.

En OSX y Linux, esta característica es totalmente compatible, pero en Windows, es un poco complicado. Windows XP no lo admite, pero Vista y versiones posteriores lo admiten. Sin embargo, para que la función funcione, dupeGuru debe ejecutarse con privilegios administrativos.