Existe uma maneira de procurar arquivos pelo valor de hash?

1

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

Isso pode ser útil ao tentar duplicar as duplicatas do arquivo de ponto. 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.

Samir
fonte
1
A menos que o sistema de arquivos mantenha uma tabela de hashes (a maioria não o faz), você precisa calculá-los como parte da pesquisa. Eu prefiro usar um programa que faça isso para você - ele provavelmente usará hashes internamente como um mecanismo para comparar arquivos - do que criar sua própria solução. Se você fizer sua própria solução, recomendo usar algo como md5 para o hash. Embora não seja criptograficamente seguro, ele é mais rápido que o SHA * e fornece uma boa entropia para o aplicativo, pois os arquivos não são forjados intencionalmente para criar colisões.
nitro2k01
Hashing de um arquivo raramente será mais rápido do que comparar os dados em dois arquivos (a maioria falhará rapidamente)
Bandrami
Se o hashing não é uma boa opção, então, por quais outros meios eu posso identificar um arquivo?
Samir
Aproximadamente, quanto tempo levará para o hash de 60 GiB em 135000 arquivos? Este é todo o conteúdo da pasta Meus usuários. Existe algum limite superior para o tamanho dos arquivos que eu posso usar? Eu sei que arquivos pequenos são divididos rapidamente, mas os grandes podem levar vários minutos para serem confundidos.
Samir

Respostas:

1

Esta é uma questão 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 compara o tamanho, e se os tamanhos são idênticos, então 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 o duplicado 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 que 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 de meus dados (isso exclui meus backups, é claro).

Página de Origem do Fdupes

tbenz9
fonte
1

Eu gosto de usar ferramentas simples que eu já tenho, então aqui é 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, no entanto, 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_ com o diretório que você deseja pesquisar e substituir _hash_here_ com o hash do arquivo que você deseja encontrar.

user746340
fonte
1
Por favor, edite sua resposta em vez de postar uma segunda. Embora você mencione que é uma pequena variação, você está perdendo qualquer informação sobre o que você mudou ou por que o torna melhor.
Seth
0

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

Trecho desta página: http://www.mythicsoft.com/filelocatorpro/help/en/advanced_criteria.htm

Nota: Se o tipo de expressão estiver definido como 'File Hash', então o   caixa de texto pode incluir uma lista separada por vírgula de valores hash ou um   ponteiro para um arquivo contendo uma lista de valores de hash, por exemplo

5A9C9B42A16F5E1985B7B0A019114C7A, 675C9B42A16F5E1985B7B0A019114C7A

ou,

= c: \ FileHashTable.txt

Os algoritmos reais utilizados para calcular o hash, e. SHA1, MD5, são   especificado na guia Opções.

snowdude
fonte
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

Substituir _search_location_ com o diretório que você deseja pesquisar e substituir _hash_here_ com o hash do arquivo que você deseja encontrar.

Se você quiser procurar um hash além do hash sha256, adicione -Algorithm _algorithm_ depois de Get-FileHash Onde _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!

user746347
fonte
0

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_ é pasta ou disco onde você deseja procurar por um duplicado e _search_file_ é um arquivo que possui uma duplicata em algum lugar. Você pode colocar este comando em um loop para procurar por vários arquivos ou adicionar | Remove-Item no final da linha para excluir automaticamente 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).

Alex K
fonte
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 ; }

Esse código é mais complexo do que você acha que deveria ser porque:

  • destina-se a manipular corretamente nomes de arquivos com espaços, novas linhas, barras invertidas, citações, caracteres especiais, etc. -print para -print0 para analisá-los ainda mais);
  • destina-se a aceitar hash (es) como regex (compatível com grep -E isto é egrep )
    por exemplo. '(^00)|(00$)' irá corresponder se o hash do arquivo começar ou terminar 00.

Você pode usar outro *sum ferramentas com interface compatível (por ex. md5sum ).

Kamil Maciorowski
fonte