Compare 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 com o conteúdo real do diretório para identificar arquivos ausentes.

O comando a seguir funciona individualmente, mas não quando eu o script ...

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"

Estou fazendo errado. qual é o caminho certo?

    
por jakethedog 26.06.2015 / 09:39

2 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

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

    
por 26.06.2015 / 11:04
0

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

Suponha que a lista esteja em file_t1 ; agora primeiro geramos uma lista de todos os arquivos no pc por meio de

      find . -type f > file_t2

Em seguida, classificamos os dois arquivos:

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

Agora 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 uma única linha, à custa de clareza.

Se você estiver interessado: isto é 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 operações N log N , que é, portanto, a parte mais cara desta solução, enquanto a que você propôs requer operações N ^ 2 , que é significativamente maior para seu arquivo tamanhos.

    
por 26.06.2015 / 11:13