1

У меня есть список из 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"

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

2 ответа2

0

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

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

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

0

Следуя своей стратегии, вы будете делать примерно 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 операций, что значительно больше для ваших размеров файлов.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .