Existe uma maneira fácil de substituir arquivos duplicados por hardlinks?

126

Estou procurando uma maneira fácil (um comando ou uma série de comandos, provavelmente envolvendo find ) para localizar arquivos duplicados em dois diretórios e substituir os arquivos em um diretório por hardlinks dos arquivos no outro diretório.

Aqui está a situação: Este é um servidor de arquivos no qual várias pessoas armazenam arquivos de áudio, cada usuário tendo sua própria pasta. Às vezes, várias pessoas têm cópias dos mesmos arquivos de áudio. Agora, estas são duplicatas. Eu gostaria de fazer com que eles sejam hardlinks, para economizar espaço no disco rígido.

    
por Josh 12.10.2010 / 21:23

18 respostas

40

Existe um script em perl no link que não exatamente o que você quer:

Traverse all directories named on the command line, compute MD5 checksums and find files with identical MD5. IF they are equal, do a real comparison if they are really equal, replace the second of two files with a hard link to the first one.

    
por 12.10.2010 / 22:04
67

rdfind faz exatamente o que você pede (e na ordem johny por que lista). Permite eliminar duplicados, substituí-los por links suaves ou rígidos. Combinado com symlinks , você também pode tornar o link simbólico absoluto ou relativo. Você pode até escolher o algoritmo de soma de verificação (md5 ou sha1).

Como ele é compilado, ele é mais rápido do que a maioria das soluções de script: time em uma pasta de 15 GiB com 2600 arquivos no meu Mac Mini de 2009 retorna este

9.99s user 3.61s system 66% cpu 20.543 total

(usando md5).

Disponível na maioria dos manipuladores de pacotes (por exemplo, MacPorts para Mac OS X).

    
por 05.07.2013 / 10:15
49

Use a ferramenta fdupes :

fdupes -r /path/to/folder fornece uma lista de duplicatas no diretório (-r torna recursivo). A saída é assim:

nome_do_arquivo1
filename2

nome_do_arquivo3
filename4
filename5

com filename1 e filename2 sendo idênticos e filename3, filename4 e filename5 também sendo idênticos.

    
por 12.10.2010 / 22:03
21

Eu uso hardlink do link

    
por 18.10.2011 / 06:24
18

Esta é uma das funções fornecidas pelo "fslint" - link

Clique no botão "Mesclar":

    
por 18.12.2010 / 23:38
14

Como o seu principal objetivo é economizar espaço em disco, há outra solução: a desduplicação (e provavelmente a compactação) no nível do sistema de arquivos. Em comparação com a solução de link físico, ela não tem o problema de afetar inadvertidamente outros arquivos vinculados.

O ZFS tem uma dedução (em nível de bloco, não em nível de arquivo) desde a versão 23 do pool e a compactação há muito tempo. Se você estiver usando o linux, você pode tentar o zfs-fuse , ou se você usar o BSD, ele será suportado nativamente.

    
por 13.10.2010 / 07:13
7

No Linux moderno, atualmente existe um link que desduplica em um sistema de arquivos btrfs, mas 1) sem a maior varredura sobrecarga, 2) arquivos podem divergir facilmente novamente depois.

    
por 08.01.2014 / 18:37
5

Para encontrar arquivos duplicados, você pode usar duff .

Duff is a Unix command-line utility for quickly finding duplicates in a given set of files.

Basta executar:

duff -r target-folder

Para criar hardlinks para esses arquivos automaticamente, você precisará analisar a saída de duff com bash ou alguma outra linguagem de script.

    
por 12.10.2010 / 22:00
5
aptitude show hardlink

Descrição: Hardlink várias cópias do mesmo arquivo  Hardlink é uma ferramenta que detecta várias cópias do mesmo arquivo e as substitui por hardlinks.

A ideia foi retirada do link , mas o código foi escrito do zero e licenciado sob a licença MIT . Página inicial: link

    
por 22.11.2013 / 16:03
4

Eu usei muitas das ferramentas de hardlinking para Linux mencionadas aqui. Eu também estou preso com o ext4 fs, no Ubuntu, e tenho usado o cp -l e -s para hard / softlinking. Mas ultimamente notei a cópia leve na página do manual cp , o que implicaria em poupar o espaço em disco redundante até que um lado seja modificado:

   --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.
    
por 14.03.2012 / 10:59
3

Parece-me que verificar primeiro o nome do arquivo pode acelerar as coisas. Se dois arquivos não possuem o mesmo nome de arquivo, então, em muitos casos, eu não os consideraria duplicados. Parece que o método mais rápido seria comparar, na ordem:

  • nome do arquivo
  • tamanho
  • soma de verificação md5
  • conteúdo de byte

Algum método faz isso? Veja duff , fdupes , rmlint , fslint , etc.

O método a seguir foi votado no topo commandlinefu.com : Localizar arquivos duplicados (com base no tamanho primeiro, depois no hash MD5)

A comparação de nome de arquivo pode ser adicionada como primeiro passo, tamanho como segundo passo?

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
    
por 09.07.2012 / 17:02
2

Eu fiz um script em Perl que faz algo parecido com o que você está falando:

link

Basicamente, ele apenas percorre um diretório, calculando o valor SHA1 dos arquivos nele, codificando e vinculando correspondências. É útil em muitas e muitas ocasiões.

    
por 31.01.2011 / 03:06
2

Como não sou fã do Perl, aqui está uma versão 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

Isso encontra todos os arquivos com a mesma soma de verificação (sejam eles grandes, pequenos ou já hardlinks) e os vincula.

Isso pode ser muito otimizado para execuções repetidas com sinalizadores adicionais de localização (por exemplo, tamanho) e um cache de arquivos (para que você não precise refazer as somas de verificação a cada vez). Se alguém estiver interessado na versão mais inteligente e mais longa, posso publicá-la.

OBSERVAÇÃO: Como foi mencionado anteriormente, os hardlinks funcionam desde que os arquivos nunca precisem de modificações ou sejam movidos entre os sistemas de arquivos.

    
por 03.07.2012 / 07:15
2

Se você quiser substituir duplicatas por Hard Links no Mac ou em qualquer sistema baseado em UNIX, você pode tentar o link do SmartDupe. estou desenvolvendo isso

    
por 04.11.2012 / 01:57
1

Os aplicativos FSLint ( link ) podem encontrar todos os arquivos iguais em qualquer pasta (por conteúdo) e criar hardlinks. Experimente!

Jorge Sampaio

    
por 15.01.2015 / 17:29
0

Se você fizer hardlinks, preste atenção nos direitos sobre esse arquivo. Aviso, proprietário, grupo, modo, atributos estendidos, tempo e ACL (se você usar isso) é armazenado em INODE. Somente nomes de arquivos são diferentes porque são armazenados na estrutura de diretórios e outros apontam para as propriedades INODE. Esta causa, todos os nomes de arquivo ligados ao mesmo inode, possuem os mesmos direitos de acesso. Você deve impedir a modificação desse arquivo, porque qualquer usuário pode danificar o arquivo para outro. É simples. É o suficiente, qualquer usuário colocar outro arquivo no mesmo nome. O número do inode é então salvo e o conteúdo do arquivo original é destruído (substituído) para todos os nomes com hardlink.

A melhor maneira é a desduplicação na camada do sistema de arquivos. Você pode usar BTRFS (última vez muito popular), OCFS ou assim. Veja a página: link , especialmente na tabela Recursos e deduplicação de dados da coluna. Você pode clicar e classificar:)

Veja especificamente o sistema de arquivos ZFS. Isto está disponível como FUSE, mas desta forma é muito lento. Se você quiser suporte nativo, veja a página link . Em seguida, você deve corrigir o kernel e, em seguida, instalar as ferramentas do zfs para gerenciamento. Eu não entendo, porque o linux não suporta como drivers, é o caminho para muitos outros sistemas operacionais / kernels.

Os sistemas de arquivos suportam deduplicação de duas formas, desduplicando arquivos ou blocos. O ZFS suporta bloco. Isso significa que o mesmo conteúdo que se repete no mesmo arquivo pode ser desduplicado. Outra forma é a hora em que os dados são desduplicados, isso pode ser online (zfs) ou offline (btrfs).

Observe que a desduplicação consome RAM. Por isso, gravar arquivos no volume ZFS montado com o FUSE causa um desempenho extremamente lento. Isso está descrito na documentação. Mas você pode on-line on / off desduplicação no volume. Se você vir dados desduplicados, simplesmente defina a deduplicação, reescreva algum arquivo para qualquer arquivo temporário e, finalmente, substitua. Depois disso, você pode desativar a deduplicação e restaurar o desempenho total. Claro, você pode adicionar ao armazenamento qualquer cache de discos. Isso pode ser muito rápido girar discos ou discos SSD. Claro que isso pode ser discos muito pequenos. No trabalho real, isso é substituto para a RAM:)

No linux, você deve tomar cuidado com o ZFS, porque nem todos funcionam como deveria, especialmente quando você gerencia o sistema de arquivos, cria um instantâneo, etc., mas se você faz a configuração e não a altera, tudo funciona corretamente. De outra forma, você deve mudar o linux para o opensolaris, ele suporta nativamente o ZFS :) O que é muito bom com o ZFS é que isso funciona tanto como sistema de arquivos, quanto como gerenciador de volume similar ao LVM. Você não precisa quando usa o ZFS. Veja a documentação se você quiser saber mais.

Observe a diferença entre o ZFS e o BTRFS. O ZFS é mais antigo e mais maduro, infelizmente apenas no Solaris e OpenSolaris (infelizmente estrangulado pelo oracle). BTRFS é mais novo, mas da última vez muito bem suportado. Eu recomendo o kernel fresco. O ZFS tem deduplicação on-line, que causa lentidão nas gravações, porque tudo é calculado on-line. BTRFS suporta desduplicação off-line. Isso economiza desempenho, mas quando o host não tem nada para fazer, você executa a ferramenta periodicamente para fazer a deduplicação. E o BTRFS é criado nativamente sob o linux. Talvez seja melhor para você:)

    
por 24.06.2014 / 10:51
0

Links rígidos podem não ser a melhor ideia; se um usuário alterar o arquivo, isso afeta ambos. No entanto, excluir um link físico não exclui os dois arquivos. Além disso, não tenho certeza se os Hard Links ocupam a mesma quantidade de espaço (no disco rígido, não no sistema operacional) que várias cópias do mesmo arquivo; de acordo com o Windows (com o Link Shell Extension), eles fazem. Concedido, isso é o Windows, não o Unix ...

Minha solução seria criar um arquivo "comum" em uma pasta oculta e substituir as duplicatas reais por links simbólicos ... em seguida, os links simbólicos seriam incorporados com metadados ou fluxos de arquivos alternativos que registram apenas os dois "arquivos" são diferentes uns dos outros, como se uma pessoa quisesse alterar o nome do arquivo ou adicionar uma capa de álbum personalizada ou algo assim; pode até ser útil fora dos aplicativos de banco de dados, como ter várias versões do mesmo jogo ou software instalado e testá-los independentemente, mesmo com as menores diferenças.

    
por 03.05.2016 / 20:43
0

A maneira mais fácil é usar um programa especial dupeGuru

como documentação diz

Deletion Options

These options affect how duplicate deletion takes place. Most of the time, you don’t need to enable any of them.

Link deleted files:

The deleted files are replaced by a link to the reference file. You have a choice of replacing it either with a symlink or a hardlink. ... a symlink is a shortcut to the file’s path. If the original file is deleted or moved, the link is broken. A hardlink is a link to the file itself. That link is as good as a “real” file. Only when all hardlinks to a file are deleted is the file itself deleted.

On OSX and Linux, this feature is supported fully, but under Windows, it’s a bit complicated. Windows XP doesn’t support it, but Vista and up support it. However, for the feature to work, dupeGuru has to run with administrative privileges.

    
por 13.06.2017 / 16:20