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?
Respostas:
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.
Isso lê o arquivo list.lst 1 linha de cada vez.
fonte
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
Então ordenamos os dois arquivos:
Agora nós usamos comm para gerar uma lista de diferenças:
Onde:
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.
fonte