Existe uma maneira de procurar arquivos por valor hash?

Existe uma maneira de procurar arquivos por valor hash?

Existe uma maneira de ter um valor hash como entrada ao pesquisar arquivos e uma lista completa de arquivos e suas localizações como saída?

Isso pode ser útil ao tentar identificar duplicatas de arquivos. Muitas vezes me encontro em situações em que tenho vários arquivos que sei que já armazenei em algum local, mas não sei onde. Eles são essencialmente duplicados.

Por exemplo, eu poderia ter vários arquivos em um disco rígido portátil e também cópias impressas desses arquivos no disco rígido interno de um computador desktop... mas não tenho certeza da localização! Agora, se os arquivos não forem renomeados, eu poderia fazer uma pesquisa pelo nome do arquivo para tentar localizar a cópia impressa na área de trabalho. Eu poderia então compará-los lado a lado e caso fossem iguais eu poderia deletar a cópia que tenho no disco rígido portátil. Mas se os arquivos foram renomeados em qualquer um dos discos rígidos, isso provavelmente não funcionaria (dependendo de quanto os novos nomes diferem dos originais).

Se um arquivo for renomeado, mas não editado, eu poderia calcular seu valor de hash, por exemplo, o valor SHA1 é 74e7432df4a66f246b5214d60b190b67e2f6ce52. Gostaria então de ter esse valor como entrada ao pesquisar arquivos e fazer com que o sistema operacional pesquise em um determinado diretório ou em todo o sistema de arquivos por arquivos com esse valor de hash SHA1 exato e produza uma lista completa de locais onde esses arquivos estão armazenados.

Estou usando o Windows, mas geralmente estou interessado em saber como algo assim pode ser alcançado, independentemente do sistema operacional.

Responder1

Exemplo Linux:

hash='74e7432df4a66f246b5214d60b190b67e2f6ce52'
find . -type f -exec sh -c '
   sha1sum "$2" | cut -f 1 -d " " | sed "s|^\\\\||" | grep -Eqi "$1"
' find-sh "$hash" {} \; -print

Este código é mais complexo do que você imagina porque:

  • destina-se a manipular corretamente nomes de arquivos com espaços, novas linhas, barras invertidas, aspas, caracteres especiais, etc. (altere -printpara -print0para analisá-los mais detalhadamente);
  • destina-se a aceitar hash(s) como regex (compatível com grep -Eie egrep),
    por exemplo , '^00|00$'corresponderá se o hash do arquivo começar ou terminar com 00; um exemplo mais prático é pesquisar por vários hashes de uma vez: '74…|a9…|…|…|…'(reticências para abreviar, use hashes completos).

Você pode usar outras *sumferramentas com interface compatível (por exemplo md5sum).

Responder2

Se você tiver o PowerShell v.4.0 ou superior, poderá usar o comando:

Get-ChildItem _search_location_ -Recurse | Get-FileHash | 
Where-Object hash -eq (Get-FileHash _search_file_).hash | Select path

Onde _search_location_está a pasta ou disco onde você deseja procurar uma duplicata e _search_file_é um arquivo que possui uma duplicata em algum lugar. Você pode colocar este comando em um loop para procurar vários arquivos ou adicionar | Remove-Itemno final da linha para excluir automaticamente as duplicatas.

Observe também que este comando é adequado apenas para pequenas pastas de pesquisa - levará muito tempo se o seu local de pesquisa tiver milhares de arquivos (como um disco rígido inteiro).

Responder3

Esta é uma questão intrigante. Tenho usado uma ferramenta chamada fdupes para realizar algo semelhante. O Fdupes pesquisará recursivamente os diretórios e comparará cada arquivo com todos os outros arquivos. Primeiro, ele compara o tamanho e, se os tamanhos forem idênticos, ele cria hashes dos arquivos e compara isso; se os hashes forem iguais, ele percorre cada arquivo byte por byte e compara-o.

Quando if encontrar todos os arquivos que são realmente idênticos, você poderá fazer várias coisas. Eu faço com que ele exclua a duplicata e crie um hardlink em seu lugar (economizando espaço no disco rígido), embora você possa simplesmente exibir os locais dos arquivos duplicados e não fazer nada com eles. Este é o cenário que você está perguntando.

Algumas desvantagens do fdupes são que, até onde eu sei, ele é apenas Linux e, como ele compara todos os arquivos com todos os outros, leva bastante tempo e E/S para ser executado. Ele não "procura" um arquivo, por exemplo, mas lista todos os arquivos que possuem um hash idêntico.

Eu recomendo fortemente e configurei-o para ser executado em um cron job todos os dias para que eu nunca tenha duplicatas desnecessárias dos meus dados (isso exclui meus backups, é claro).

Página de origem do Fdupes

Responder4

Voidtools Tudo 1.5 (Alfa)A ferramenta de pesquisa para Windows tem a opção de adicionar uma coluna de vários hashes, como CRC-32, CRC-64, MD5, SHA-1, SHA-256 para cada arquivo.

insira a descrição da imagem aqui

Você também pode pesquisar um hash específico, por exemplomd5:71E.. insira a descrição da imagem aqui

informação relacionada