Ferramentas como fdupes são um exagero ridículo ao lidar com arquivos compactados jpg ou h264. Dois desses arquivos com exatamente o mesmo tamanho de arquivo já é uma boa indicação de que eles são idênticos.
Se, digamos, além disso, 16 pedaços equidistantes de 16 bytes forem extraídos e comparados e eles também forem iguais, isso seria bastante evidência para eu supor que eles são idênticos. Existe algo assim?
(A propósito, estou ciente de que o tamanho do arquivo por si só pode ser um indicador pouco confiável, pois existem opções para compactar para determinados tamanhos de destino, como 1 MB ou 1 CD/DVD. Se o mesmo tamanho de destino for usado em muitos arquivos, é bastante razoável que alguns arquivos diferentes terão exatamente o mesmo tamanho.)
czkawka é uma ferramenta de código aberto que foi criada para encontrar arquivos duplicados (e imagens, vídeos ou músicas) e apresentá-los através de linhas de comando ou interfaces gráficas, com ênfase na velocidade. Esta parte da documentação pode lhe interessar:
Com a versão GUI, os hashes serão armazenados em um cache para que a busca por duplicatas posteriormente seja muito mais rápida.
Exemplos:
Crie alguns arquivos de teste:
Geramos imagens aleatórias e copiamos
a.jpg
parab.jpg
obter uma duplicata.Verifique apenas o tamanho:
Verifique os arquivos por seus hashes:
Verifique os arquivos analisando-os como imagens:
Você provavelmente gostaria de fazer uma comparação completa (ou hash) no primeiro e no último 1 MiB ou mais, onde os metadados podem viver que podem ser editados sem introduzir deslocamentos nos dados compactados. Além disso, a granularidade de leitura do armazenamento geralmente é de pelo menos 512 bytes e não 16, então é melhor fazer isso; um pouco de tempo extra de CPU para comparar mais dados é trivial. (Alinhado em um limite de 512 bytes)
(Um tamanho de setor de gravação de pelo menos 4096B é típico, mas um tamanho de setor lógico de 512 pode permitir que um disco SATA envie apenas o 512B solicitado pela rede, se o kernel não ampliar a solicitação para uma página inteira. provavelmente seria; o pagecache é gerenciado em páginas inteiras.)
Lembre-se de que o bit-rot é possível , especialmente se os arquivos tiverem sido armazenados em DVD-R ou outra mídia óptica. Eu não excluiria um "duplicado" sem verificar se há bits idênticos (ou pelo menos hashes idênticos). Descartar duplicatas rapidamente com base em uma assinatura de hash de uma parte inicial de um arquivo é útil, mas você ainda deseja fazer uma verificação completa antes de declarar dois arquivos duplicados para a maioria dos propósitos.
Se dois arquivos são quase iguais, mas têm algumas diferenças de bits, use
ffmpeg -i foo.mp4 -f null -
para encontrar falhas, decodificar, mas não fazer nada com a saída.Se você encontrar uma diferença bit a bit, mas nenhum arquivo tiver erros que um decodificador notará, use
ou
-f framemd5
para ver qual quadro tem uma diferença que não era um fluxo h.264 inválido. Em seguida, procure lá e inspecione visualmente qual está corrompido.Seu método pode ser bom para detectar arquivos que são cópias corrompidas (ou editadas por metadados) uns dos outros, algo que os localizadores de duplicatas normais não farão facilmente. Comentários sob a questão apontam que
jdupes
pode usar hashes dos primeiros N megabytes de um arquivo após uma comparação de tamanho, então esse é um passo na direção certa.Para outros casos de uso, talvez você esteja bem com uma verificação menos rigorosa, mas dado que existem localizadores de arquivos duplicados que só comparam ou fazem hash quando há arquivos de tamanho idêntico, você pode simplesmente deixar um deles rodar (durante a noite ou enquanto você 'está saindo) e volte para uma lista totalmente verificada.
Alguns
fslint
têm a opção de vincular duplicatas umas às outras (ou link simbólico), então da próxima vez que você procurar duplicatas, elas já serão o mesmo arquivo. Portanto, na minha experiência, a localização de arquivos duplicados não é algo em que senti a necessidade de adotar uma abordagem mais rápida, mas arriscada.(
fslint
nunca foi atualizado para Python3, aparentementeczkawka
é um clone moderno em Rust, de acordo com uma resposta do askubuntu .)O GNU
cmp
ajuda você?-s
opção para suprimir a saída e usar apenas o valor de retorno-i
(pular inicial) e-n
(número de bytes para comparar) você pode definir adicionalmente um intervalo de bytes que deseja compararSe o número de arquivos for muito grande para
cmp
cada par deles, você pode querer primeirosort
todos os arquivos pelo tamanho e comparar apenas grupos com o mesmo tamanho (uniq -D
com-w
).Implementação de shellscript da ideia do OP, @vume
Fundo com o exemplo
rsync
Dê uma olhada
rsync
. Possui vários níveis de verificação se os arquivos são idênticos. O manualman rsync
é muito detalhado, e você pode identificar o que eu descrevo, e provavelmente também algumas outras alternativas interessantes.A verificação mais rigorosa é comparar cada byte, mas à medida que você escreve, leva muito tempo quando há muitos dados, por exemplo, um backup inteiro.
A verificação padrão é o tamanho e outros atributos de arquivo (por exemplo, carimbos de hora). Muitas vezes é considerado bom o suficiente.
Sua ideia, @vume, significa algo entre esses dois níveis de verificação. Eu não vi nenhuma ferramenta como essa, mas eu estaria muito interessado em tal ferramenta.
Edição 1: O script de shell
vumer
O shellscript a seguir
vumer
usadd
para fazer o que eu acho que você quer, @vume.Na minha estação de trabalho Lenovo C30 (antiga, mas bastante poderosa) testei
vumer
com o arquivo iso Ubuntu Desktop 22.04 LTS e comparei o tempo usado commd5sum
,Então, para arquivos grandes, é realmente muito mais rápido que o
md5sum
, que hoje é considerado uma ferramenta de soma de verificação [muito] simples.sha256sum
é ainda mais lento.Eu verifiquei também com um arquivo iso Debian que foi convertido para substituir algumas opções de inicialização
quiet splash
epersistence
comparado com seu arquivo original.vumer
teve azar e não verificou os poucos locais modificados. Então, aqui devemos recorrer ao carimbo de data/hora clássico para dizer a diferença. Claro quemd5sum
pode dizer a diferença.Portanto, depende do tipo de arquivos que você possui e de como eles podem ser modificados, se
vumer
ferramentas semelhantes são úteis.Edit 2: Um 'oneliner' para escanear uma árvore de diretórios
Este é um 'oneliner' para escanear uma árvore de diretórios
vumer
identificou 30 arquivos (15 pares) com a mesma soma de verificação vumermd5sum
identificou 18 arquivos (9 pares) com a mesma soma de verificação md5sumIsso significa que
vumer
economizou muito tempo;md5sum
necessário verificar apenas 30 dos 418 arquivos.Edição 3: O shellscript
scan4dblt
Substituí o 'oneliner' por um script ,
scan4dblt
, que também testei em algumas árvores de diretórios e fiz algumas edições no script 'doer',vumer
.Editar 4: shellscript aprimorado
scan4dblt
mais exemplo (arquivo de saída)O shellscript
scan4dblt
é desenvolvido e testado com algumas árvores de diretórios, incluindo grandes arquivos iso, fotos, videoclipes e documentos. Vários bugs foram corrigidos (e a versão atual substitui a original aqui).Exemplo:
O exemplo a seguir mostra o arquivo de saída produzido por
Embora uma pequena minoria dos arquivos tenha sido totalmente verificada por
md5sum
, as verificações completas usaram a maior parte do tempo de execução. A proporção de tempomd5sum
dependerá dos tamanhos dos arquivos.Particularmente quando há muitos arquivos relativamente pequenos, essa implementação via shellscripts será ineficiente, um programa compilado seria muito melhor. Mas com arquivos enormes, por exemplo, arquivos iso e videoclipes, shellscripts podem fazer um bom trabalho.
Edit 5: Comentário adicional sobre os shellscripts
Se eu fizesse este exercício novamente, começaria salvando duplas separadamente devido aos links físicos e manteria um arquivo restante [com link físico] na lista para verificar se ele corresponde a mais um arquivo em comparações posteriores.
Também seria interessante testar como grandes blocos de dados devem ser verificados para [para a ferramenta chamada
vumer
aqui] fazer um bom trabalho. Isso provavelmente deve ser feito sob medida para o tipo de arquivo a ser verificado quanto a duplicatas.Eu também testaria qual tamanho de arquivo, onde é útil com a verificação intermediária [por
vumer
].Comentários finais
Fico feliz em notar quanta atenção esta pergunta recebeu, tanto respostas quanto comentários. Como Peter Cordes escreve em sua resposta (assim como nos comentários), a ferramenta de teste rápido (no meu caso
vumer
) pode ser melhorada de várias maneiras dependendo do tipo de arquivo que é feito para testar.Na minha resposta, implementei apenas a ideia original do @vume e posso mostrar que é bom o suficiente em muitos casos quando combinado com outros métodos de classificação rápida para minimizar a necessidade de testes completos de soma de verificação.
Existe uma ferramenta chamada imosum que funciona de forma semelhante, por exemplo,
sha256sum
, but it only uses three 16 kB blocks. The samples are taken from beginning, middle and end of the file, and file size is included in the hash also.Exemplo de uso para encontrar duplicatas:
A saída terá grupos de arquivos duplicados:
No meu SSD, isso levou cerca de 10 segundos para processar 72 GB de fotos digitais (10 mil arquivos).
Minha ferramenta usual ao lidar com a comparação de arquivos é usar
hash
. Por exemplo:irá criar hashes e classificá-los para que você possa ver no arquivo as duplicatas.
E isso dá uma confiança muito maior de que os arquivos são os mesmos que os primeiros bytes.
Como autor da ferramenta disketo , posso recomendar que: https://github.com/martlin2cz/disketo
Clone isso e execute:
Ele irá colocar em cada linha um caminho para o arquivo, que tenha pelo menos uma duplicata (com o mesmo nome) então com caminho para todas essas duplicidades (separadas por TAB).
Você pode personalizar a pesquisa. Em vez de "files-with-duplicities.ds" pré-instalados, forneça um script de disketo personalizado . Para comparar não apenas o nome do arquivo, mas também o tamanho, use o arquivo ds :
Se você deseja comparar com base em outra coisa (ou seja, alguns pedaços de 16 bytes do conteúdo do arquivo), use o sub personalizado:
Ou abra um problema e eu poderia adicioná-lo.