Estoy buscando una manera fácil (un comando o una serie de comandos, probablemente involucrados 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.
Respuestas:
Hay un script perl en http://cpansearch.perl.org/src/ANDK/Perl-Repository-APC-2.002/eg/trimtrees.pl que hace exactamente lo que desea:
fuente
rdfind
está disponible a través de los administradores de paquetes para TODAS las plataformas principales (os x, linux, (cyg) win, solaris), y funciona a una velocidad nativa increíble. Así que mira la respuesta a continuación.[Errno 31] Too many links
. Esta secuencia de comandos parece ser lo único que maneja eso.rdfind
hace exactamente lo que pides (y en el orden johny por qué las listas). Permite eliminar duplicados, reemplazarlos con enlaces blandos o duros. Combinado consymlinks
usted 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).Dado que está compilado, es más rápido que la mayoría de las soluciones con script:
time
en una carpeta de 15 GiB con 2600 archivos en mi Mac Mini de 2009, devuelve esto(usando md5).
Disponible en la mayoría de los controladores de paquetes (por ejemplo, MacPorts para Mac OS X).
fuente
rdfind
y me encantó. Tiene una-dryrun true
opción que le permitirá saber lo que habría hecho. Reemplazar duplicados con enlaces duros es tan simple como-makehardlinks true
. Produjo un buen registro y me dejó saber cuánto espacio se liberó. Además, según el punto de referencia del autor , rdfind es más rápido que duff y fslint.Usa la
fdupes
herramienta:fdupes -r /path/to/folder
le da una lista de duplicados en el directorio (-r lo hace recursivo). El resultado se ve así:filename1
filename2
filename3
filename4
filename5
con filename1 y filename2 son idénticos y filename3, filename4 y filename5 también son idénticos.
fuente
rdfind
- comofdupes
, pero más rápido y disponible en OS X y Cygwin también.fdupes
parece que solo encuentra duplicados, no los reemplaza con enlaces duros, por lo que no es una respuesta a la pregunta IMO.jdupes
que se basa enfdupes
, pero también puede reemplazar los archivos duplicados con enlaces simbólicos (-l
), enlaces duros (-L
) o instruir a btrfs para deduplicar los bloques en el nivel del sistema de archivos (-B
si está usando btrfs).Yo uso
hardlink
de http://jak-linux.org/projects/hardlink/fuente
hardlink
en Fedora / RHEL / etc.hardlink
ahora es un binario nativo en muchos sistemas de paquetes de Linux (desde ~ 2014) y extremadamente rápido. Para archivos de 1,2M (320GB), solo tomó 200 segundos (enlazando aproximadamente el 10% de los archivos).hardlink
fue creado por Julian Andres Klode mientras que el Fedorahardlink
fue creado por Jakub Jelinek (fuente: pagure.io/hardlink - nombre del paquete Fedora: hardlink)Esta es una de las funciones proporcionadas por "fslint" - http://en.flossmanuals.net/FSlint/Introduction
Haga clic en el botón "Fusionar":
fuente
sudo apt-get install fslint
/usr/share/fslint/fslint/findup -m /your/directory/tree
(el directorio / usr / share / fslint / fslint / no está en $ PATH por defecto)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 probar zfs-fuse , o si usa BSD, es compatible de forma nativa.
fuente
btrfs
utilice la deduplicación por lotes o fuera de línea (ejecútela siempre que lo considere útil / necesario) btrfs.wiki.kernel.org/index.php/Deduplicationrsync --inplace
para que solo se almacenen los bloques modificados)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 nuevamente después.
fuente
cp --reflink
, ver también a continuación)Para encontrar archivos duplicados puede usar duff .
Simplemente ejecute:
Para crear enlaces duros a esos archivos automáticamente, deberá analizar la salida de duff con bash o algún otro lenguaje de secuencias de comandos.
fuente
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 la licencia MIT. Página de inicio: http://jak-linux.org/projects/hardlink/
fuente
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 sus cp -l y -s para hard / softlinking. Pero últimamente noté la copia ligera en la página de manual de cp , lo que implicaría ahorrar espacio en disco redundante hasta que se modifique un lado:
fuente
cp
alias para incluir siempre el--reflink=auto
parámetro ahora--reflink
?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:
¿Algún método hace esto? Mira
duff
,fdupes
,rmlint
,fslint
, etc.El siguiente método fue el más votado en commandlinefu.com : Buscar archivos duplicados (basado primero en el tamaño, luego en hash MD5)
¿Se puede agregar la comparación de nombre de archivo como primer paso, el tamaño como segundo paso?
fuente
duff
,fdupes
yrmlint
, y recomiendo a los lectores a mirar a la tercera parte de éstos . Tiene un excelente conjunto de opciones (y documentación). Con él, pude evitar mucho del procesamiento posterior que necesitaba usar con las otras herramientas.install.sh
archivos se pueden encontrar en un sistema activo? No puedo contar la cantidad de veces que guardé un archivo y tuve un choque de nombres, con un cambio de nombre sobre la marcha para guardarlo. Otro lado: no tengo idea de cuántas veces he descargado algo de diferentes fuentes, en diferentes días, solo para descubrir que son el mismo archivo con diferentes nombres. (Lo que también mata la fiabilidad de la marca de tiempo). 1: Tamaño, 2: Resumen, 3: Contenido de bytes.Como no soy fanático de Perl, aquí hay una versión bash:
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.
fuente
rdfind
, que funcionan a velocidades nativas y solo requierenbrew install rdfind
oapt-get install rdfind
para instalarse.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 que contiene, dividiéndolo en hash y vinculando las coincidencias. Ha sido útil en muchas, muchas ocasiones.
fuente
Si desea reemplazar duplicados por enlaces duros en mac o cualquier sistema basado en UNIX, puede probar SmartDupe http://sourceforge.net/projects/smartdupe/ estoy desarrollándolo
fuente
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
fuente
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,7 GB de una partición completa de 98% de 158 GB (unidad SSD) en aproximadamente un minuto):fuente
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 los archivos son diferentes porque se almacenan 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, ya que 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. Es por eso que escribir archivos en el 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 ser deduplicado, 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 el 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 es mejor FS para ti :)
fuente
btrfs
. Excelente discusión de las opciones (incluida lacp --reflink
opción) aquí: btrfs.wiki.kernel.org/index.php/DeduplicationLos 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 de 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.
fuente
La forma más fácil es usar el programa especial dupeGuru
como dice la documentación
fuente