Comparar lista de arquivos de um banco de dados usando localizar para localizar arquivos ausentes

1

Eu tenho uma lista de 2000 arquivos de um banco de dados que se parece com isso:

./aa/0f/unique-string/IMG_0987.JPG
./ab/cf/unique-string/IMG_0987.JPG

Eu quero comparar essa lista para o conteúdo do diretório real para identificar arquivos ausentes.

O seguinte comando funciona individualmente, mas não quando eu scripto ...

find . -false -samefile ./ab/cf/unique-string/IMG_0987.JPG

O mais próximo que cheguei é o seguinte:

#!/bin/bash
TEST=`cat ./list.lst`
find . -false -samefile "$TEST"

Eu estou fazendo errado. Qual é o caminho certo?

jakethedog
fonte
Pls dê uma olhada na minha resposta, para uma solução mais rápida.
MariusMatutiae

Respostas:

0

Seu comando find está usando todo o conteúdo de list.lst porque você não está alimentando através de uma linha de cada vez.

while read f; do
find . -false -samefile "$f"
done<./list.lst

Isso lê o arquivo list.lst 1 linha de cada vez.

Jack
fonte
Isso está correto, mas muito mais lento do que o necessário. Pls vê minha resposta.
MariusMatutiae
0

Seguindo sua estratégia, você estará fazendo sobre 2000x2000 = 4.000.000 comparações. Você pode fazer melhor que isso.

Suponha que a lista esteja em file_t1 ; Agora nós primeiro gerar uma lista de todos os arquivos no PC por meio de

      find . -type f > file_t2

Então ordenamos os dois arquivos:

      sort -n file_t1 > file1
      sort -n file_t2 > file2

Agora nós usamos comm para gerar uma lista de diferenças:

      comm -X file1 file2

Onde:

      X = 12 -> lines that appear in **both** files
      X = 13 -> lines unique to file 2
      X = 23 -> lines unique to file1

Isso poderia ser feito com um one-liner, à custa da clareza.

Se você estiver interessado: isso é muito mais rápido porque os arquivos já estão classificados (um requisito estrito para comm ), então eles tomam por ordem N passos para comparar, se o tamanho do arquivo for N. A classificação requer N log N operações, que é, portanto, a parte mais cara desta solução, enquanto a que você propôs requer N ^ 2 operações, que é significativamente maior para o tamanho dos seus arquivos.

MariusMatutiae
fonte