Ваша команда find использует все содержимое list.lst, потому что вы не передаете его через 1 строку за раз.
while read f; do find . -false -samefile "$f" done<./list.lst
Это читает файл list.lst по 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"
Я делаю это неправильно. какой правильный путь?
Ваша команда find использует все содержимое list.lst, потому что вы не передаете его через 1 строку за раз.
while read f; do find . -false -samefile "$f" done<./list.lst
Это читает файл list.lst по 1 строке за раз.
Следуя своей стратегии, вы будете делать примерно 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 операций, что значительно больше для ваших размеров файлов.