Frage an bash, find, command-line, linux – Kann "finden" oder ein anderes Tool nach Dateien suchen, die im Vordergrund stehen?

29

Manchmal weiß ich, dass eine Datei nicht so tief entfernt ist, aber in einem sehr dichten Unterverzeichnis kann ich die gewünschten Dateien nicht leicht finden.

Könnenfinden (oder ein anderes Tool) mit der Breitensuche nach Dateien suchen?

Und meistern Sie die "Prune" -Option derfinden Befehl, während Sie dabei sind. Es hat keinen Sinn, sich in eine tiefgreifende rekursive Suche in einem tief verwurzelten, stark besetzten Verzeichnis-Teilbaum zu verstricken, wenn Sie wissen, dass das gesuchte Objekt - Datei oder Verzeichnis - nicht vorhanden ist. Vietnhi Phuvan
Für den Fall, dass Sie noch so etwas suchen, schrieb ichdiese Tavian Barnes

Deine Antwort

5   die antwort
17

Du kannst den ... benutzen-depth Option, um den Inhalt eines Verzeichnisses vor dem Verzeichnis selbst zu verarbeiten. Sie können auch die-maxdepth Option, um die Anzahl der Verzeichnisse zu begrenzen, für die ein Drill ausgeführt werden soll.

Das ist noch keine umfassende erste Suche. Das ist nur eine begrenzte Tiefe bei der ersten Suche. Eine begrenzte Tiefensuche löst zwar das Problem, "eine Datei zu finden, die nicht so tief entfernt ist", dies ist jedoch definitiv keine umfassende Erstsuche. yiati
"Art von" ist richtig - dies ist immer noch keine echte Breitensuche, da a / b / c vor a / d besucht wird. Gut genug für die meisten Zwecke. ephemient
0
find . | awk '{FS = "/" ; print "", NF, $F}' | sort -n  | awk '{print $2}' | xargs grep -d skip "search term"

lle '/' Zeichen. Die Zählung wird sortiert und anschließend die Zählungsspalte gelöscht. Schließlich verwendet es xargs, um die sortierte Liste der Dateien zu durchsuchen.

Es ist wirklich hässlich.

4

find mit dem--maxdepth Möglichkeit.

Das ist bei derVerzeichnisse Abschnitt in Ihrer Referenzseite; Möglicherweise sind andere Optionen je nach Ihren Anforderungen besser geeignet.

Um bei der ersten Suche eine exakte Breite zu erzielen, müssen Sie eine gemischte Schleife verwenden--mindepth und--maxdepth Optionen. Aber ich denke nicht, dass es notwendig ist, genau zu sein, eine Suche mit begrenzter Tiefe wird normalerweise ausreichen.

5

bei dem Variable als Warteschlange verwendet wird.

Erstellenbfs.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

Mach es ausführbar:

$ chmod u+x ./bfs.sh

Dann können Sie eine Breitensuche durchführen, indem Sie:

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

10

Horrible Hack, wird nicht funktionieren-0 oder andere Aktionen als-print, ineffizient usw. usw.

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

Im Grunde läuft das einfach

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

bis umfind Gibt den Status ungleich Null zurück oder druckt nichts.

@MattLuongo: Aus Ihrem Link: "IDDFS entspricht der Breitensuche, benötigt jedoch viel weniger Speicher." Mooing Duck
Minigolf:for((i=0;1;i++));do find -mindepth $i -maxdepth $i|grep .||break;done Max Murphy
Sieht aus wieiterative Tiefensuche mir... Matt Luongo
@MooingDuck Ich war nicht anderer Meinung, dass dies funktioniert. Ich wies nur darauf hin, dass es einen bestimmten Namen hat. IDFS ist auch langsamer als BFS, da jedes Mal die vorherige Ebene im Baum 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 Durchlaufen dominiert werdenn+1Es lohnt sich also oft. Matt Luongo
Beachten Sie jedoch, dass der Unterschied zwischen BFS und IDFS für einen bestimmten Suchbereich erheblich sein kann, wenn Sie an jedem Knoten eine signifikante Verarbeitung durchführen. Matt Luongo

Verwandte Fragen