Existe uma maneira de procurar arquivos pelo valor de hash?

1

Existe uma maneira de eu ter um valor de hash como entrada ao procurar por arquivos e uma lista completa de arquivos e seus locais como saída?

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

Por exemplo, eu poderia ter um monte de arquivos em um disco rígido portátil, e também cópias 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 de nome de arquivo para tentar localizar a cópia impressa na área de trabalho. Eu poderia então compará-los lado a lado e, no caso de serem os mesmos, eu poderia excluir a cópia que tenho no disco rígido portátil. Mas se os arquivos tiverem sido renomeados em um dos discos rígidos, isso provavelmente não funcionaria (dependendo de quanto os novos nomes diferem do original).

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

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

    
por Samir 24.12.2013 / 13:52

6 respostas

1

Esta é uma pergunta intrigante. Eu tenho usado uma ferramenta chamada fdupes para realizar algo semelhante. Fdupes irá pesquisar recursivamente através de diretórios e comparar todos os arquivos com todos os outros arquivos. Primeiro ele compara o tamanho, e se os tamanhos são idênticos, ele cria hashes dos arquivos e compara isso, se os hashes são os mesmos, então, na verdade, passa por cada byte de arquivo byte e compara-o.

Quando se encontra todos os arquivos que são verdadeiramente idênticos, você pode fazer várias coisas. Eu tenho que excluir a duplicata e criar um link físico em seu lugar (poupando-me espaço em disco), embora você possa tê-lo simplesmente a saída dos locais dos arquivos duplicados e não fazer nada com eles. Este é o cenário sobre o qual você está perguntando.

Algumas desvantagens dos fdupes são que, até onde eu sei, é apenas Linux, e como compara cada arquivo com todos os outros arquivos, é necessário um pouco de E / S e tempo para execução. Ele não "procura" um arquivo por palavra, mas listaria todos os arquivos que possuem um hash idêntico.

Eu recomendo e o configuro para ser executado em um cron job todos os dias, para que eu nunca tenha nenhuma duplicação desnecessária dos meus dados (isso exclui meus backups, é claro).

Página de origem do Fdupes

    
por 24.12.2013 / 21:38
1

Eu gosto de usar ferramentas simples que eu já tenho, então aqui está uma maneira de fazer isso com o Windows PowerShell (por isso, obviamente, só funciona no Windows). Na verdade, é uma pequena edição da resposta de Alex K, mas a questão era como pesquisar usando hashes, enquanto sua resposta procurava por uma cópia de um arquivo específico.

Get-ChildItem "_search_location_" -Recurse | Get-FileHash | Where-Object hash -eq _hash_here_ | Select path

Simplesmente substitua _search_location_ pelo diretório que você deseja pesquisar e substitua _hash_here_ pelo hash do arquivo que você deseja encontrar.

    
por 07.07.2017 / 09:22
0

Existe uma ferramenta ($) chamada FileLocator Pro que pode pesquisar por hash de arquivo (SHA-x ou MD5).

Trecho desta página: link

Note: If the expression type is set to 'File Hash' then the containing text box can include a comma separated list of hash values or a pointer to a file containing a list of hash values, e.g.

5A9C9B42A16F5E1985B7B0A019114C7A,675C9B42A16F5E1985B7B0A019114C7A

or,

=c:\FileHashTable.txt

The actual algorithms used to calculate the hash, e.g. SHA1, MD5, are specified in the Options tab.

    
por 30.12.2013 / 14:42
0

Aqui está um exemplo para um algoritmo MD5:

Get-ChildItem "_search_location_" -Recurse | Get-FileHash -Algorithm MD5 | Where-Object hash -eq _hash_here_ | Select path

Substitua _search_location_ pelo diretório que você deseja pesquisar e substitua _hash_here_ pelo hash do arquivo que você deseja encontrar.

Se você quiser procurar um hash além do hash sha256, adicione -Algorithm _algorithm_ após Get-FileHash , em que _algorithm_ é o algoritmo escolhido.

Tenha em atenção que isto requer o PowerShell 4.0 e irá recalcular cada hash para cada ficheiro para cada pesquisa!

    
por 07.07.2017 / 09:39
0

Se você tiver o PowerShell v.4.0 ou superior, use o comando:

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

Em que _search_location_ é a pasta ou o disco em que 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-Item no final da linha para excluir automaticamente os duplicados.

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

    
por 20.12.2016 / 16:31
0

Exemplo do Linux:

echo '74e7432df4a66f246b5214d60b190b67e2f6ce52' | { read hash ; find -type f -exec sh -c 'sha1sum "$1" | cut -f 1 -d " " | sed "s|^\\||" | grep -Eqi "$0"' "$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, citações, caracteres especiais, etc. (altere -print para -print0 para analisá-los ainda mais);
  • destina-se a aceitar hash (es) como regex (compatível com grep -E , ou seja, egrep ),
    por exemplo. '(^00)|(00$)' corresponderá se o hash do arquivo começar ou terminar com 00 .

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

    
por 07.07.2017 / 13:19