我需要在一个大型目录树中搜索大量可能的文件名,即我有一个输入文件,其中包含一长串字符串,我需要在树中找到这些字符串(或如下所示:打印所有不在树中的字符串)
作为基于文件系统的解决方案,我可以做这样的事情:
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
这对我有用(如果你想找到该文件不是匹配;否则,从 grep 选项中省略 v):
find /path/to/dir > tree.txt
grep -vf inputnames.txt tree.txt
如果你想知道有多少个:grep -vf inputnames.txt tree.txt | wc -l
这将查找/计算 tree.txt 中所有符合以下条件的出现次数不是匹配 中的任意字符串inputnames.txt
。