Verifique se o arquivo existe

Verifique se o arquivo existe

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 -cobter 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 md5sumum 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/checktem arquivos image-001através de -010, enquanto folder/to/searchtem image-002atravé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 extralinha diz que image-011.jpgestava presente, folder/to/searchmas não era obrigatório (já que não está em folder/to/check), e a missinglinha diz que image-001.jpgfoi 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 extrae 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, mtreeinformaremos 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).

informação relacionada