
Tenho uma pasta com milhares folder/to/check/
de imagens (70G) que eu, para cada arquivo quero verificar se já existe em outro diretório com milhares de milhares de imagens (414G folder/to/search/
).
Este é o script que criei, mas está demorando muito para ser executado, então acho que a tarefa poderia ser otimizada.
find folder/to/check/ -type f -exec md5sum {} + | awk -F" " '{ print $1,$2 }' | while read -r p1 p2; do find folder/to/search/ -type f -exec md5sum {} + | grep "^$p1" && echo "Found: $p1 $p2" || echo "Not found: $p1 $p2"; done > out.txt
Alguém tem uma ideia de como ou poderia me indicar a direção certa de como otimizar o script? Minhas habilidades são muito básicas.
Responder1
Fazem isto.
Calcule a soma md5 de cada imagem na pasta "to-check" e grave-a em um arquivo de texto.
Calcule a soma md5 de cada imagem na pasta "to-search" e anexe ao primeiro arquivo.
Classifique este arquivo gigante em um novo arquivo.
Use algo como
uniq -c
obter uma contagem do número de vezes que cada linha é duplicada.
Se eu acertei seu comando (talvez não), acho que agora você está executando md5sum
um total de X * Y vezes, mas com o acima, isso é reduzido para X + Y vezes.
Responder2
mtree
é um utilitário útil sempre que você precisa comparar duas hierarquias de arquivos procurando carimbos de data/hora iguais/diferentes ou hashes MD5/SHA256 iguais/diferentes.
Vamos configurar uma hierarquia de teste simples:
$ mkdir -p folder/to/check
$ mkdir -p folder/to/search
$ for N in $(jot -w %03d 10); do touch `/image-$N.jpg; done
$ for N in $(jot -w %03d 10 2); do touch folder/to/search/image-$N.jpg; done
folder/to/check
tem arquivos image-001
através de -010
, enquanto folder/to/search
tem image-002
através de -011
. Todos os arquivos são idênticos (zero bytes), mas possuem carimbos de data/hora variados.
Se vocêapenasdeseja verificar o hash MD5 (e a presença/ausência de cada arquivo), então:
$ mtree -kmd5 -cp folder/to/check | mtree -p folder/to/search
extra: image-011.jpg
./image-001.jpg missing
A extra
linha diz que image-011.jpg
estava presente, folder/to/search
mas não era obrigatório (já que não está em folder/to/check
), e a missing
linha diz que image-001.jpg
foi encontrado na pasta de origem ( folder/to/check
), mas não na pasta de destino ( folder/to/search
).
Se você quiser verificar o carimbo de data/hora além do hash MD5, então:
$ mtree -Kmd5 -cp folder/to/check | mtree -p folder/to/search
.: modification time (Mon Sep 30 16:16:15 2019, Mon Sep 30 16:16:24 2019)
image-010.jpg:
modification time (Mon Sep 30 16:16:15 2019, Mon Sep 30 16:16:24 2019)
image-008.jpg:
modification time (Mon Sep 30 16:16:15 2019, Mon Sep 30 16:16:24 2019)
image-006.jpg:
modification time (Mon Sep 30 16:16:15 2019, Mon Sep 30 16:16:24 2019)
extra: image-011.jpg
image-007.jpg:
modification time (Mon Sep 30 16:16:15 2019, Mon Sep 30 16:16:24 2019)
image-009.jpg:
modification time (Mon Sep 30 16:16:15 2019, Mon Sep 30 16:16:24 2019)
image-004.jpg:
modification time (Mon Sep 30 16:16:15 2019, Mon Sep 30 16:16:24 2019)
image-003.jpg:
modification time (Mon Sep 30 16:16:15 2019, Mon Sep 30 16:16:24 2019)
image-002.jpg:
modification time (Mon Sep 30 16:16:15 2019, Mon Sep 30 16:16:24 2019)
image-005.jpg:
modification time (Mon Sep 30 16:16:15 2019, Mon Sep 30 16:16:24 2019)
./image-001.jpg missing
Essa saída ainda mostra as mesmas linhas extra
e missing
, além de vários arquivos idênticos no hash MD5, mas com carimbos de data e hora diferentes. Finalmente, se algum dos arquivos tiver um hash MD5 diferente do seu equivalente, mtree
informaremos quais:
$ date > folder/to/search/image-007.jpg
$ mtree -Kmd5 -cp folder/to/check | mtree -p folder/to/search
.: modification time (Mon Sep 30 16:16:15 2019, Mon Sep 30 16:16:24 2019)
image-010.jpg:
modification time (Mon Sep 30 16:16:15 2019, Mon Sep 30 16:16:24 2019)
image-008.jpg:
modification time (Mon Sep 30 16:16:15 2019, Mon Sep 30 16:16:24 2019)
image-006.jpg:
modification time (Mon Sep 30 16:16:15 2019, Mon Sep 30 16:16:24 2019)
extra: image-011.jpg
image-007.jpg:
size (0, 29)
modification time (Mon Sep 30 16:16:15 2019, Mon Sep 30 16:25:05 2019)
md5digest (0xd41d8cd98f00b204e9800998ecf8427e, 0x6fd624d18a8fe0c096b19ff858a2acf7)
image-009.jpg:
modification time (Mon Sep 30 16:16:15 2019, Mon Sep 30 16:16:24 2019)
image-004.jpg:
modification time (Mon Sep 30 16:16:15 2019, Mon Sep 30 16:16:24 2019)
image-003.jpg:
modification time (Mon Sep 30 16:16:15 2019, Mon Sep 30 16:16:24 2019)
image-002.jpg:
modification time (Mon Sep 30 16:16:15 2019, Mon Sep 30 16:16:24 2019)
image-005.jpg:
modification time (Mon Sep 30 16:16:15 2019, Mon Sep 30 16:16:24 2019)
./image-001.jpg missing
Responder3
Existem utilitários para fazer isso, mas você mesmo deseja fazer isso:
- Obtenha o tamanho em bytes de todos os arquivos e faça listas de todos os arquivos com exatamente o mesmo tamanho.
- Para listas que possuem mais de um elemento (não tantos, especialmente entre arquivos grandes):
- calcule o MD5 de todos os elementos da lista
- verifique se há duplicatas
Em essência, isso faz com que você calcule o hash MD5uma veze apenas para arquivos cujo tamanho você não pode discriminar.
É claro que isso pressupõe que você não tenha duplicatas entre os arquivos existentes ou entre os novos arquivos (mas também pode ser facilmente ajustado para verificar isso).