
Мне нужно выполнить поиск в большом дереве каталогов для большого количества возможных имен файлов, т. е. у меня есть входной файл с длинным списком строк, которые мне нужно найти в дереве (или, как показано ниже: вывести все те, которых нет в дереве)
В качестве решения на основе файловой системы я могу сделать что-то вроде этого:
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
Это работает для меня (если вы хотите найти эти файлынетсоответствие; в противном случае опустите 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
.