2009-07-06 3 views
27

Manchmal weiß ich, dass eine Datei nicht so tief ist, aber ein sehr dichtes Unterverzeichnis erlaubt mir nicht, die Dateien zu finden, die ich leicht haben möchte.Kann "finden" oder ein anderes Tool nach Dateien Breite zuerst suchen?

Kann find (oder ein anderes Tool) mithilfe der breast-first-Suche nach Dateien suchen?

+1

Falls Sie noch nach so etwas suchen, schrieb ich [this] (https://github.com/tavianator/bfs) –

+0

Und beherrschen Sie die "Pflaume" -Option des ** find ** -Befehls während Du bist dabei. Es macht keinen Sinn, sich in eine tiefgreifende rekursive Suche nach tief verwurzelten Verzeichnissen zu versenken, wenn Sie das Objekt - Datei oder Verzeichnis - kennen, nach dem Sie suchen. –

Antwort

16

Ja, irgendwie.

Sie können die Option -depth verwenden, damit der Inhalt eines Verzeichnisses vor dem Verzeichnis selbst verarbeitet wird. Sie können auch die Option -maxdepth verwenden, um die Anzahl der zu durchsuchenden Verzeichnisse einzuschränken.

+2

"Sortierung" ist richtig - das ist immer noch keine echte Breitensuche, da a/b/c vor a/d besucht wird. Gut genug für die meisten Zwecke, obwohl. – ephemient

+1

Das ist immer noch nicht die erste Suche. Das ist nur eine begrenzte Tiefensuche.Die erste Suche mit begrenzter Tiefe löst das Problem, "eine Datei zu finden, die nicht so tief ist", aber nichtsdestoweniger ist dies definitiv nicht die erste Suche. – yiati

4

Verwenden Sie find mit der Option --maxdepth.

Das ist im Directories Abschnitt in Ihrer Referenzseite; Möglicherweise finden Sie andere Optionen, die Ihren Anforderungen entsprechen.

Um die exakte Breite zuerst zu erreichen, müssen Sie mit den Optionen --mindepth und --maxdepth eine Schleife bilden. Aber ich denke nicht, dass es notwendig ist, so genau zu sein, eine Suche mit Tiefenbegrenzung reicht normalerweise aus.

7

Horrible Hack, nicht mit -0 arbeiten oder anderen Aktionen als -print, ineffizient etc. etc ...

#!/bin/bash 
i=0 
while results=$(find -mindepth $i -maxdepth $i "[email protected]") && [[ -n $results ]]; do 
    echo "$results" 
    ((i++)) 
done 

Grundsätzlich ist dieser läuft nur

find -mindepth 0 -maxdepth 0 
find -mindepth 1 -maxdepth 1 
find -mindepth 2 -maxdepth 2 
………………………………………………………………………… 

bis find kehrt nicht Null Status oder druckt nichts.

+3

Sieht aus wie [iterative Tiefensuche zuerst] (http://en.wikipedia.org/wiki/Iterative_deepening_depth-first_search) für mich ... –

+1

@MattLuongo: Von Ihrem Link: "IDDFS ist äquivalent zur Breitensuche, verwendet aber viel weniger Speicher; " –

+1

@MooingDuck Ich war nicht uneins, dass das funktioniert, nur darauf hinweist, dass es einen bestimmten Namen hat. IDFS ist auch langsamer als BFS, da jedes Mal die vorherige Ebene der Baumstruktur erneut durchlaufen werden muss. Das Argument, das ich gehört habe, ist, dass bei den meisten Suchproblemen die Laufzeitkosten von den Kosten für das Traversieren von "n + 1" dominiert werden, also lohnt es sich oft. –

5

Ein Querverweis, bei dem die Variable als Warteschlange verwendet wird. Erstellen

bfs.sh

#!/bin/bash 

queue="$1" 
shift 

while [ -n "$queue" ] 
do 
    echo "$queue" | xargs -I'{}' find {} -mindepth 1 -maxdepth 1 $* 
    queue=`echo "$queue" | xargs -I'{}' find {} -mindepth 1 -maxdepth 1 -type d` 
done 

ausführbar machen:

$ chmod u+x ./bfs.sh

Dann Sie tun können, Breiten erste finden von:

$ ./bfs.sh /path/to/somewhere -name foobar

0
find . | awk '{FS = "/" ; print "", NF, $F}' | sort -n | awk '{print $2}' | xargs grep -d skip "search term" 

Es verwendet suchen, um alle Dateien aufzulisten. Der erste awk Befehl zählt alle '/' Zeichen. Es sortiert nach der Anzahl und lässt dann die Zählungsspalte fallen. Schließlich verwendet es xargs, um die sortierte Liste von Dateien zu grep.

Es ist wirklich hässlich.