
Ich muss einen großen Verzeichnisbaum nach einer großen Anzahl möglicher Dateinamen durchsuchen, d. h. ich habe eine Eingabedatei mit einer langen Liste von Zeichenfolgen, die ich im Baum finden muss (oder wie unten: alle Zeichenfolgen ausdrucken, die nicht im Baum sind).
Als dateisystembasierte Lösung kann ich so etwas tun:
while read a;
do
count=`find /path/to/dir -name "*$a*" | wc -l`; ;
if [ $count -eq 0 ];
then
echo $a;
fi
done < inputnames.txt
was angesichts der Größe des Baums und der Größe der Eingabedatei äußerst ineffizient ist. Ich dachte dann, ich könnte die Ausgabe einfach find
in eine Datei kopieren
find /path/to/dir > pathtodir_tree.txt
und greppen Sie dann die Datei.
while read a;
do
count=`grep $a pathtodir_tree.txt | wc -l`;
if [ $count -eq 0 ];
then
echo $a;
fi
done < inputnames.txt
was viel schneller ist. Meine Fragen sind: Übersehe ich eine effizientere dateisystembasierte Lösung? Wenn nicht, gibt es eine andere Lösung, die effizienter (oder allgemein besser) ist als die von mir vorgeschlagene grep-basierte Lösung?
Antwort1
Das funktioniert bei mir (wenn Sie diese Dateien finden möchtennichtÜbereinstimmung; andernfalls lassen Sie das „v“ aus der grep-Option weg):
find /path/to/dir > tree.txt
grep -vf inputnames.txt tree.txt
Und wenn Sie wissen möchten, wie viele es sind:grep -vf inputnames.txt tree.txt | wc -l
Dies findet/zählt alle Vorkommen in tree.txt, dienichtpasst zu einer beliebigen Zeichenfolge in inputnames.txt
.