Сравните список файлов из базы данных, используя find для поиска отсутствующих файлов.

215
jakethedog

У меня есть список из 2000 файлов из базы данных, который выглядит следующим образом:

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

Я хочу сравнить этот список с фактическим содержимым каталога, чтобы определить отсутствующие файлы.

Следующая команда работает индивидуально, но не тогда, когда я ее пишу

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

Самое близкое, что я пришел, это следующее:

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

Я делаю это неправильно. какой правильный путь?

1
Просьба взглянуть на мой ответ, для более быстрого решения. MariusMatutiae 9 лет назад 0

2 ответа на вопрос

0
Jack

Ваша команда find использует все содержимое list.lst, потому что вы не передаете его через 1 строку за раз.

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

Это читает файл list.lst по 1 строке за раз.

Это правильно, но гораздо медленнее, чем нужно. Просьба посмотреть мой ответ. MariusMatutiae 9 лет назад 0
0
MariusMatutiae

Следуя своей стратегии, вы будете делать примерно 2000x2000 = 4 000 000 сравнений. Вы можете сделать лучше, чем это.

Предположим, что список находится в file_t1 ; Теперь мы сначала генерируем список всех файлов на компьютере с помощью

 find . -type f > file_t2 

Затем мы сортируем оба файла:

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

Теперь мы используем comm для создания списка отличий:

 comm -X file1 file2 

где:

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

Это можно сделать с помощью одной строки, за счет ясности.

Если вы заинтересованы: это намного быстрее, так как файлы уже отсортированы (строгое требование комм ), поэтому они занимают порядка N шагов для сравнения, если размер файла N. Сортировка требует N журнал N операций, которые, таким образом, самая дорогая часть этого решения, в то время как предложенное вами требует N ^ 2 операций, что значительно больше для ваших размеров файлов.