Questão Encontrando um arquivo por md5sum


Dado o md5sum de um arquivo, eu quero saber se em qualquer outro lugar na árvore de diretório 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 recursivamente, não apenas no diretório atual.


1


origem




Respostas:


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, já que não há comutador para que apenas a soma seja somada.

Você pode verificar a soma MD5 muito mais fácil com md5 se você está no BSD ou OS X:

find . -type f -exec \
bash -c '[ "$(md5 -q "$0")" = 2690d194b68463c5a6dd53d32ba573c7 ] && echo $0' {} \;

2



Obrigado slhck parece muito interessante, mas aparentemente meu comando md5 não tem opção -q; nem tem o meu comando md5sum. Eu estou usando o Xubuntu. Além disso, qual é o {} \ para? - gojira
Desculpe, eu tive o BSD errado md5 ferramenta aqui. No Linux você precisa md5sum. Eu vou corrigir o meu post quando eu estiver de volta em um computador. O {} é o caminho do arquivo para cada arquivo encontrado. Ele é passado para sh. O \; simplesmente termina o exec ligar. - slhck


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

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

ou sem GNU encontrar:

find /path/to/tree -type f -print0 | xargs -r -0 -- md5sum | sed -nre 's/^md5-to-search-for  //p'

2





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

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

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

if [ -z "$1" ]
  then
    echo "No argument supplied"
    exit
fi

1



Isso quebra se os arquivos contiverem espaço em branco no caminho. Para iterar os arquivos que você deve usar find com exec ou globbing (por ex. **) - slhck
Outra opção seria usar -print0 na tua find comando e xargs -0. Então, neste caso, find . -type f -print0 | xargs -0 md5 | grep (your MD5 code) - Kent
Eu gosto muito dessa solução. No entanto, ele me dá toneladas de mensagens no stderr: "md5sum: somefilename: No such arquivo ou diretório". Eu me pergunto se há uma maneira de suprimir isso? - gojira
@gojira Se você obtiver um "nenhum tal arquivo ou diretório", provavelmente é porque os arquivos contêm espaço em branco, e o comando do brixenDK quebra com isso (devido ao for f in …). Se um arquivo foi nomeado foo bar, por exemplo, tentaria fazer uma soma MD5 em foo e bar, que ambos não existem. Para uma boa explicação porque isso acontece e como evitá-lo, veja: mywiki.wooledge.org/ParsingLs - slhck