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

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

Tenho duas pastas contendo vários arquivos. Alguns dos arquivos da primeira pasta possuem uma cópia exata na segunda pasta. Eu gostaria de substituí-los por um link físico. Como eu posso fazer isso?

Responder1

Conheço 4 soluções de linha de comando para Linux. Meu preferido é o último listado aqui, rdfindpor causa de 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 demorem muito para serem executadas), as comparações entre os arquivos são feitas primeiro pelo tamanho do arquivo, depois pelo hash md5 e, em seguida, pela comparação bye-by-byte.

Exemplo de saída (com opções "show size", "recursive"):

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

link físico

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

Exemplo de saída (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 atua; não tem ações disponíveis.
  • As comparações são feitas por tamanho de arquivo e depois por hash sha1.
    • O hash pode ser alterado para sha256, sha384 ou sha512.
    • Hash pode ser desabilitado para fazer uma comparação byte por byte

Exemplo de saída (com opção "recursiva"):

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

encontrar

  • As opções têm uma sintaxe incomum (destinada a imitar find?).
  • Várias opções de ações a serem executadas em arquivos duplicados (excluir, criar links simbólicos, criar hardlinks).
  • Possui modo de simulação.
  • As comparações são feitas por tamanho de arquivo, depois pelos primeiros bytes, depois pelos últimos bytes e, por fim, md5 (padrão) ou sha1.
  • A classificação dos arquivos encontrados torna previsível qual arquivo é considerado o original.

Exemplo de saída:

$ 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

Responder2

Eu recomendojdupes. É um garfo aprimorado defdupes, 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 sistema operacional
  • velocidade considerada 7 vezes mais rápida do que fdupes em média

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

Você pode querer clonar e construir a fonte mais recente a partir de seuRepositório GitHubuma vez que o projeto ainda está em desenvolvimento ativo. Binários do Windowstambém são fornecidos aqui. Binários empacotados estão disponíveis em algumas distros Linux/BSD – na verdade, eu os encontrei pela primeira vez através do $ apt search.

Responder3

Comandante Duplicadoé uma solução possível no Windows:

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

Características:

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

1

Para Linux você pode encontrar um script Bashaqui.

Responder4

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

Infelizmente, desinstalei o software há algum tempo (em uma desinstalação em massa de vários programas), por isso não consigo mais criar links manualmente, mas os ícones ainda aparecem automaticamente sempre que o Windows detecta um link rígido, simbólico ou de junção.

informação relacionada