Estou procurando uma maneira fácil (um comando ou uma série de comandos, provavelmente envolvendo find
) de encontrar arquivos duplicados em dois diretórios e substituir os arquivos em um diretório por links físicos 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 exatamente dos mesmos arquivos de áudio. No momento, essas são duplicatas. Gostaria de fazer com que eles sejam hardlinks, para economizar espaço no disco rígido.
Respostas:
Existe um script perl em http://cpansearch.perl.org/src/ANDK/Perl-Repository-APC-2.002/eg/trimtrees.pl que faz exatamente o que você deseja:
fonte
rdfind
está disponível através dos gerenciadores de pacotes para TODAS as principais plataformas (os x, linux, (cyg) win, solaris) e funciona em uma velocidade nativa escaldante. Então confira a resposta abaixo.[Errno 31] Too many links
. Este script parece ser a única coisa que lida com isso.rdfind
faz exatamente o que você pede (e na ordem em que johny lista). Torna possível excluir duplicatas, substituí-las por links flexíveis ou físicos. Combinado comsymlinks
você, 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 é compilado, é mais rápido do que a maioria das soluções com script:
time
em uma pasta de 15 GiB com 2600 arquivos no meu Mac Mini de 2009 retorna isso(usando MD5).
Disponível na maioria dos manipuladores de pacotes (por exemplo, MacPorts para Mac OS X).
fonte
rdfind
e adorei. Tem uma-dryrun true
opção que permitirá que você saiba o que teria feito. Substituir duplicatas por links físicos é tão simples quanto-makehardlinks true
. Ele produziu um bom log e me informou quanto espaço foi liberado. Além disso, de acordo com a referência do autor , o rdfind é mais rápido que o duff e o fslint.Use a
fdupes
ferramenta:fdupes -r /path/to/folder
fornece uma lista de duplicatas no diretório (-r o torna recursivo). A saída é assim:filename1
filename2
filename3
filename4
filename5
com filename1 e filename2 sendo idênticos e filename3, filename4 e filename5 também sendo idênticos.
fonte
rdfind
- likefdupes
, mas mais rápido e disponível no OS X e Cygwin também.fdupes
parece encontrar apenas duplicatas, não substituí-las por hardlinks; portanto, não é uma resposta para a pergunta IMO.jdupes
que é baseadafdupes
, mas também pode substituir os arquivos duplicados por symlinks (-l
), hardlinks (-L
) ou instruir o btrfs a deduplicar os blocos no nível do sistema de arquivos (-B
se você estiver usando o btrfs).Eu uso
hardlink
em http://jak-linux.org/projects/hardlink/fonte
hardlink
no Fedora / RHEL / etc.hardlink
agora é um binário nativo em muitos sistemas de pacotes Linux (desde ~ 2014) e extremamente rápido. Para arquivos de 1,2 milhões (320 GB), foram necessários apenas 200 segundos (vinculando aproximadamente 10% dos arquivos).hardlink
foi criado por Julian Andres Klode enquanto o Fedorahardlink
foi criado por Jakub Jelinek (fonte: pagure.io/hardlink - nome do pacote Fedora: hardlink)Esta é uma das funções fornecidas por "fslint" - http://en.flossmanuals.net/FSlint/Introduction
Clique no botão "Mesclar":
fonte
sudo apt-get install fslint
/usr/share/fslint/fslint/findup -m /your/directory/tree
(diretório / usr / share / fslint / fslint / não está na $ PATH por padrão)Como seu principal objetivo é economizar espaço em disco, existe outra solução: desduplicação (e provavelmente compactação) no nível do sistema de arquivos. Comparado com a solução de link físico, ele não tem o problema de afetar inadvertidamente outros arquivos vinculados.
O ZFS possui desduplicação (em nível de bloco e não de arquivo) desde a versão 23 do pool e compactação há muito tempo. Se você estiver usando o linux, tente o zfs-fuse ou, se usar o BSD, ele será suportado nativamente.
fonte
btrfs
usa a desduplicação em lote ou offline (execute-a sempre que considerar útil / necessária) btrfs.wiki.kernel.org/index.php/Deduplicationrsync --inplace
tão somente blocos alterados são armazenados)Atualmente, no Linux moderno, há https://github.com/g2p/bedup que deduplica em um sistema de arquivos btrfs, mas 1) sem a sobrecarga da verificação, 2) arquivos podem divergir facilmente novamente depois.
fonte
cp --reflink
, veja também abaixo)Para encontrar arquivos duplicados, você pode usar o duff .
Basta executar:
Para criar links automáticos para esses arquivos automaticamente, você precisará analisar a saída do duff com o bash ou alguma outra linguagem de script.
fonte
Descrição: vincula várias cópias do mesmo arquivo ao Hardlink O Hardlink é uma ferramenta que detecta várias cópias do mesmo arquivo e as substitui por links físicos.
A ideia foi retirada de http://code.google.com/p/hardlinkpy/ , mas o código foi escrito do zero e licenciado sob a licença MIT. Página inicial: http://jak-linux.org/projects/hardlink/
fonte
Eu usei muitas das ferramentas de hardlinking para Linux mencionadas aqui. Eu também estou preso ao ext4 fs, no Ubuntu, e tenho usado seus cp -l e -s para hard / softlinking. Mas ultimamente notei a cópia leve na página de manual do cp , o que implicaria em poupar espaço em disco redundante até que um lado fosse modificado:
fonte
cp
alias para sempre incluir o--reflink=auto
parâmetro agora--reflink
?Parece-me que verificar o nome do arquivo primeiro pode acelerar as coisas. Se dois arquivos não tiverem o mesmo nome de arquivo, em muitos casos, eu não os consideraria duplicados. Parece que o método mais rápido seria comparar, em ordem:
Algum método faz isso? Olhe
duff
,fdupes
,rmlint
,fslint
, etc.O método a seguir foi votado com mais êxito em commandlinefu.com : Localizar arquivos duplicados (com base no tamanho primeiro e depois no hash MD5)
A comparação de nome de arquivo pode ser adicionada como uma primeira etapa, tamanho como uma segunda etapa?
fonte
duff
,fdupes
ermlint
, e recomendo fortemente os leitores a olhar para a terceira delas . Possui um excelente conjunto de opções (e documentação). Com isso, pude evitar grande parte do pós-processamento necessário para usar com as outras ferramentas.install.sh
arquivos podem ser encontrados em um sistema ativo? Não consigo contar o número de vezes que salvei um arquivo e tive um conflito de nome, com algumas renomeações dinâmicas para salvá-lo. Outro lado: não faço ideia de quantas vezes baixei algo de fontes diferentes, em dias diferentes, apenas para descobrir que eles têm o mesmo arquivo com nomes diferentes. (O que também reduz a confiabilidade do registro de data e hora.) 1: Tamanho, 2: Resumo, 3: Conteúdo de bytes.Já que eu não sou fã de Perl, aqui está uma versão do bash:
Ele localiza todos os arquivos com a mesma soma de verificação (sejam grandes, pequenos ou já possuem links físicos) e os vincula juntos.
Isso pode ser bastante otimizado para execuções repetidas com sinalizadores de localização adicionais (por exemplo, tamanho) e um cache de arquivo (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.
NOTA: Como mencionado anteriormente, os hardlinks funcionam desde que os arquivos nunca precisem de modificação ou sejam movidos pelos sistemas de arquivos.
fonte
rdfind
que funcionam em velocidades nativas e requerem apenasbrew install rdfind
ouapt-get install rdfind
para serem instaladas.Eu criei um script Perl que faz algo semelhante ao que você está falando:
http://pastebin.com/U7mFHZU7
Basicamente, ele apenas percorre um diretório, calculando a soma SHA1 dos arquivos, hash e vinculando correspondências. É útil em muitas e muitas ocasiões.
fonte
Se você deseja substituir duplicatas por Hard Links no mac ou em qualquer sistema baseado em UNIX, tente o SmartDupe http://sourceforge.net/projects/smartdupe/ estou desenvolvendo
fonte
Os aplicativos FSLint ( http://www.pixelbeat.org/fslint/ ) podem encontrar todos os arquivos iguais em qualquer pasta (por conteúdo) e criar links físicos . De uma chance!
Jorge Sampaio
fonte
jdupes
foi mencionado em um comentário, mas merece sua própria resposta, já que provavelmente está disponível na maioria das distribuições e roda muito rápido (ele liberou 2,7 GB de uma partição de 98% de 158 GB (unidade SSD) em cerca de um minuto):fonte
Se você criar hardlinks, preste atenção nos direitos desse arquivo. Aviso, proprietário, grupo, modo, atributos estendidos, hora e ACL (se você usar isso) são armazenados no INODE. Somente nomes de arquivos são diferentes, pois eles são armazenados na estrutura de diretórios e outros apontam para as propriedades INODE. Essa causa, todos os nomes de arquivos vinculados ao mesmo inode, têm os mesmos direitos de acesso. Você deve impedir a modificação desse arquivo, porque qualquer usuário pode danificá-lo para outro. É simples É o suficiente, qualquer usuário coloca outro arquivo com o mesmo nome. O número do inode é salvo e o conteúdo do arquivo original é destruído (substituído) para todos os nomes com links físicos.
Melhor maneira é a desduplicação na camada do sistema de arquivos. Você pode usar BTRFS (muito popular da última vez), OCFS ou assim. Veja a página: https://en.wikipedia.org/wiki/Comparison_of_file_systems , especialmente na tabela Recursos e deduplicação de dados da coluna. Você pode clicar e classificar :)
Veja especialmente o sistema de arquivos ZFS. Está disponível como FUSE, mas dessa maneira é muito lento. Se você deseja suporte nativo, consulte a página http://zfsonlinux.org/ . Então você deve corrigir o kernel e, em seguida, instalar as ferramentas zfs para gerenciamento. Eu não entendo, por que o linux não suporta como drivers, é o caminho para muitos outros sistemas operacionais / kernels.
Os sistemas de arquivos oferecem suporte à desduplicação de 2 maneiras, arquivos ou desduplicados. O ZFS suporta bloco. Isso significa que o mesmo conteúdo que se repete no mesmo arquivo pode ser deduplicado. Outra maneira é o momento em que os dados são deduplicados, que podem estar online (zfs) ou offline (btrfs).
Observe que a desduplicação consome RAM. É por isso que a gravação de arquivos no volume ZFS montado com o FUSE causa um desempenho dramaticamente lento. Isso está descrito na documentação. Mas você pode ativar / desativar a deduplicação on-line no volume. Se você vir algum dado que deve ser desduplicado, basta ativar a desduplicação, reescrever algum arquivo para qualquer temporário e finalmente substituí-lo. Depois disso, você pode desativar a desduplicação e restaurar o desempenho total. Obviamente, você pode adicionar ao armazenamento quaisquer discos de cache. Pode ser discos de rotação muito rápida ou discos SSD. Claro que isso pode ser discos muito pequenos. No trabalho real, isso substitui a RAM :)
No linux, você deve cuidar do ZFS, porque nem todos funcionam como deveriam, especialmente quando você gerencia o sistema de arquivos, faz instantâneos 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 opensolaris, ele suporta nativamente o ZFS :) O que é muito bom no ZFS é que ele funciona tanto como sistema de arquivos quanto como gerenciador de volumes semelhante ao LVM. Você não precisa disso quando usa o ZFS. Consulte a documentação se você quiser saber mais.
Observe a diferença entre o ZFS e o BTRFS. O ZFS é mais antigo e maduro, infelizmente apenas no Solaris e no OpenSolaris (infelizmente estrangulado pelo oracle). O BTRFS é mais jovem, mas da última vez é muito bom suportado. Eu recomendo kernel fresco. O ZFS possui desduplicação online, o que causa gravações mais lentas, porque tudo é calculado online. O BTRFS suporta desduplicação offline. Isso economiza desempenho, mas quando o host não tem nada a fazer, você executa periodicamente a ferramenta para fazer a desduplicação. E o BTRFS é criado nativamente no linux. Talvez seja melhor FS para você :)
fonte
btrfs
. Excelente discussão sobre as opções (incluindo acp --reflink
opção) aqui: btrfs.wiki.kernel.org/index.php/DeduplicationLinks físicos podem não ser a melhor ideia; se um usuário altera o arquivo, isso afeta os dois. No entanto, a exclusão de 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 SO) como várias cópias do mesmo arquivo; de acordo com o Windows (com a Link Shell Extension), eles fazem. Concedido, isso é Windows, não Unix ...
Minha solução seria criar um arquivo "comum" em uma pasta oculta e substituir as duplicatas reais por links simbólicos ... então, os links simbólicos seriam incorporados com metadados ou fluxos de arquivos alternativos que registram apenas os dois "arquivos" são diferentes entre si, como se uma pessoa quisesse alterar o nome do arquivo ou adicionar capas de álbuns personalizadas ou algo parecido; pode até ser útil fora dos aplicativos de banco de dados, como ter várias versões do mesmo jogo ou software instaladas e testá-las independentemente, mesmo com as menores diferenças.
fonte
A maneira mais fácil é usar o programa especial dupeGuru
como a documentação diz
fonte