Encontrando um arquivo por md5sum

1

Dado o md5sum de um arquivo, quero saber se em algum outro lugar da árvore de diretórios existe outro arquivo com o mesmo md5sum (mas talvez sob um nome diferente). Como posso fazer isso no bash?

P.S .: Para enfatizar, isso deve funcionar para toda a árvore abaixo de um determinado diretório, ou seja, deve funcionar de forma recursiva, não apenas no diretório atual.

    
por gojira 02.10.2013 / 07:20

3 respostas

2

Usando find para testar recursivamente todos os arquivos:

find . -type f -exec \
bash -c 'md5sum "$0" | grep -q 2690d194b68463c5a6dd53d32ba573c7 && echo $0' {} \;

Aqui, md5sum gera a soma MD5 e o nome do arquivo. Você precisa grep para a soma MD5 real, pois não há nenhuma opção para que apenas a soma seja produzida.

Você pode verificar a soma do MD5 muito mais facilmente com md5 se estiver no BSD ou OS X:

find . -type f -exec \
bash -c '[ "$(md5 -q "$0")" = 2690d194b68463c5a6dd53d32ba573c7 ] && echo $0' {} \;
    
por 02.10.2013 / 08:01
2

As outras soluções são boas, mas eu quero propor uma com menos processos gerados, que devem ser significativamente mais rápidos para muitos arquivos pequenos, se você tiver o GNU encontrado:

find /path/to/tree -type f -exec md5sum \{\} + | sed -nre 's/^md5-to-search-for  //p'

ou sem o GNU encontrar:

find /path/to/tree -type f -print0 | xargs -r -0 -- md5sum | sed -nre 's/^md5-to-search-for  //p'
    
por 03.10.2013 / 10:41
1

Tomando emprestada parte da solução do slhck, eu criei

find . -type f -print0 | while read -r -d '' f;
do
 md5sum "$f" | grep "$1"
done

Onde $ 1 é o primeiro argumento. Se você deseja verificar um argumento ausente, inicie o arquivo com:

if [ -z "$1" ]
  then
    echo "No argument supplied"
    exit
fi
    
por 02.10.2013 / 08:14