Мне нужно искать в большом дереве каталогов большое количество возможных имен файлов, т.е. у меня есть входной файл с длинным списком строк, которые мне нужно найти в дереве (или, как показано ниже: распечатать все те, которые не находятся в дерево)

Как решение на основе файловой системы я могу сделать что-то вроде этого:

while read a;
do
    count=`find /path/to/dir -name "*$a*" | wc -l`; ;
    if [ $count -eq 0 ];
    then
    echo $a;
    fi
done < inputnames.txt

что крайне неэффективно, учитывая размер дерева и размер входного файла. Затем я решил, что могу просто вывести вывод find в файл

find /path/to/dir > pathtodir_tree.txt

а затем grep файл.

while read a;
do
    count=`grep $a pathtodir_tree.txt | wc -l`;
    if [ $count -eq 0 ];
    then
    echo $a;
    fi
done < inputnames.txt

что намного быстрее. Мои вопросы: мне не хватает более эффективного решения на основе файловой системы? Если нет, есть ли другое решение, которое более эффективно (или вообще лучше), чем решение на основе grep, которое я предлагаю?

1 ответ1

0

Это работает для меня (если вы хотите найти, что файлы не совпадают; в противном случае, опустите v в опции grep):

find /path/to/dir > tree.txt
grep -vf inputnames.txt tree.txt

И если вы хотите узнать, сколько их: grep -vf inputnames.txt tree.txt | wc -l

Это находит / считает все вхождения в tree.txt, которые не соответствуют ни одной из строк в inputnames.txt .

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