Como substituir todos os arquivos duplicados por links físicos?

20

Eu tenho duas pastas contendo vários arquivos. Alguns dos arquivos da primeira pasta possuem uma cópia exata na segunda pasta. Gostaria de substituir aqueles com um link físico. Como eu posso fazer isso?

qdii
fonte
2
Forneça o sistema operacional e o sistema de arquivos.
4305 Steven
Bem, eu uso o ext4 no ubuntu 15.04, mas se alguém fornecer uma resposta para outro sistema operacional, tenho certeza que pode ser útil para alguém que está lendo esta pergunta.
Qdii 4/05/15
Aqui está uma pergunta duplicado em Unix.SE .
Alexey

Respostas:

20

Conheço 4 soluções de linha de comando para linux. O meu preferido é o último listado aqui rdfind, devido a todas as opções disponíveis.

fdupes

  • Este parece ser o mais recomendado / mais conhecido.
  • É o mais simples de usar, mas sua única ação é excluir duplicatas.
  • Para garantir que as duplicatas sejam realmente duplicadas (embora não demore uma eternidade para executar), as comparações entre os arquivos são feitas primeiro pelo tamanho do arquivo, depois pelo md5 hash e depois pela comparação por byte.

Saída de amostra (com as opções "show size", "recursive"):

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

hardlink

  • Projetado para, como o nome indica, substituir os arquivos encontrados por hardlinks.
  • Tem uma --dry-runopção.
  • Não indica como o conteúdo é comparado, mas, ao contrário de todas as outras opções, leva em consideração o modo do arquivo, o proprietário e a hora da modificação.

Saída de amostra (observe como meus dois arquivos têm tempos de modificação ligeiramente diferentes, então, na segunda execução, eu digo para ignorar isso):

$ 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

duff

  • Feito para encontrar arquivos nos quais o usuário age; não tem ações disponíveis.
  • As comparações são feitas pelo tamanho do arquivo e, em seguida, sha1 hash.
    • O hash pode ser alterado para sha256, sha384 ou sha512.
    • O hash pode ser desativado para fazer uma comparação de byte a byte

Saída de amostra (com a opção "recursiva"):

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

rdfind

  • As opções têm uma sintaxe incomum (criada para imitar find?).
  • Várias opções para ações a serem executadas em arquivos duplicados (excluir, criar links simbólicos, criar links físicos).
  • Tem um modo de funcionamento a seco.
  • As comparações são feitas pelo tamanho do arquivo, primeiro bytes, depois bytes, e então md5 (padrão) ou sha1.
  • A classificação dos arquivos encontrados torna previsível qual arquivo é considerado o original.

Saída de amostra:

$ 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
fonte
1
"então MD5 (padrão) ou sha1." Isso não significa que os arquivos sejam idênticos. Como a computação de um hash exige que o programa leia o arquivo inteiro de qualquer maneira, ele deve apenas comparar os arquivos inteiros, byte por byte. Economiza tempo de CPU também.
endolith 21/01
@endolith É por isso que você sempre começar com dry-run, para ver o que iria acontecer ...
Izkata
1
Mas o objetivo do software é identificar arquivos duplicados para você. Se você precisar verificar manualmente se os arquivos são realmente duplicados, isso não é bom.
Endolith
2
Se você tiver n arquivos com tamanho idêntico, primeiro e final e bytes finais, mas todos eles são diferentes, determinar isso por comparação direta requer n ! comparações de pares. A mistura de todos eles e a comparação de hashes provavelmente será muito mais rápida, especialmente para arquivos grandes e / ou grandes números de arquivos. Qualquer pessoa que passe nesse filtro poderá fazer comparações diretas para verificar. (Ou simplesmente usar um hash melhor para começar.)
Alan De Smet
6

O Commander duplicado é uma solução possível no Windows:

Duplicate Commander é um aplicativo freeware que permite encontrar e gerenciar arquivos duplicados no seu PC. O Duplicate Commander vem com muitos recursos e ferramentas que permitem recuperar o espaço em disco dessas duplicatas.

Recursos:

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

1

Para Linux, você pode encontrar um script Bash aqui .

Karan
fonte
2

O Duplicate & Same File Searcher é outra solução no Windows:

O Duplicate & Same Files Searcher (Duplicate Searcher) é um aplicativo para pesquisar arquivos duplicados (clones) e links físicos NTFS para o mesmo arquivo. Ele pesquisa o conteúdo duplicado do arquivo, independentemente do nome do arquivo (é usada uma comparação verdadeira de byte a byte). Este aplicativo permite não apenas excluir arquivos duplicados ou movê-los para outro local, mas também substituir duplicados por links físicos NTFS (exclusivos!)

insira a descrição da imagem aqui

Greck
fonte
1

Eu tinha uma ferramenta bacana no meu computador chamada Link Shell Extension; não só foi ótimo para criar links físicos e links simbólicos, mas também junções! Além disso, adicionou ícones personalizados que permitem identificar facilmente diferentes tipos de links, mesmo aqueles que já existiam antes da instalação; Setas vermelhas representam Links físicos, por exemplo, enquanto Verde representam Links simbólicos ... e cadeias representam Junções.

Infelizmente, eu desinstalei o software há algum tempo (em uma desinstalação em massa de vários programas), então não consigo criar mais links manualmente, mas os ícones ainda aparecem automaticamente sempre que o Windows detecta um link Difícil, Simbólico ou de Junção.

Amaroq Starwind
fonte
1

Eu recomendo jdupes . É uma bifurcação aprimorada de fdupes , mas também inclui:

  • um monte de novas opções de linha de comando - incluindo --linkhard, ou -Labreviado
  • suporte nativo para todas as principais plataformas de SO
  • velocidade considerada 7 vezes mais rápida do que os fdupes, em média

Para sua pergunta, você pode apenas executar $ jdupes -L /path/to/your/files.

Você pode clonar e criar a fonte mais recente do repositório GitHub, pois o projeto ainda está em desenvolvimento ativo. Os binários do Windows também são fornecidos aqui. Binários empacotados estão disponíveis em algumas distribuições Linux / BSD - na verdade, eu o encontrei pela primeira vez $ apt search.

Arnie97
fonte