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.
fonte
Respostas:
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
fonte
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.
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.fonte
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
fonte
Aqui está um exemplo para um algoritmo MD5:
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 deGet-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!
fonte
Se você tiver o PowerShell v.4.0 ou superior, poderá usar o comando:
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).
fonte
Exemplo do Linux:
Esse código é mais complexo do que você acha que deveria ser porque:
-print
para-print0
para analisá-los ainda mais);grep -E
isto éegrep
)por exemplo.
'(^00)|(00$)'
irá corresponder se o hash do arquivo começar ou terminar00
.Você pode usar outro
*sum
ferramentas com interface compatível (por ex.md5sum
).fonte