
大規模なディレクトリ ツリーで多数の可能性のあるファイル名を検索する必要があります。つまり、ツリー内で検索する必要がある文字列の長いリストを含む入力ファイルがあります (または以下のように: ツリー内にないものをすべて印刷します)。
ファイル システム ベースのソリューションとして、次のようなことができます。
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
。