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.
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?
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.