Pytanie w sprawie linux, command-line, bash, find – Czy „znajdź” lub inne narzędzie może wyszukiwać pliki w pierwszej kolejności?

29

Czasami wiem, że plik nie jest tak głęboko, ale bardzo gęsty podkatalog nie pozwala mi łatwo znaleźć potrzebnych plików.

Mogąodnaleźć (lub dowolne inne narzędzie) szukaj plików za pomocą wyszukiwania w pierwszej kolejności?

I opanuj opcję „przycinania”odnaleźć polecenie, gdy jesteś przy tym. Nie ma sensu wpadać w głębokie, rekursywne wyszukiwanie jakiegoś głęboko zakorzenionego, zaludnionego poddrzewa katalogu, gdy wiesz, że obiekt - plik lub katalog - którego szukasz, nie istnieje. Vietnhi Phuvan
Na wypadek, gdybyś wciąż szukał czegoś takiego, napisałemto Tavian Barnes

Twoja odpowiedź

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

licza wszystkie znaki „/”. Sortuje liczbę, a następnie upuszcza kolumnę zliczania. W końcu używa xargs do grep posortowanej listy plików.

To jest naprawdę brzydkie.

5

Stwórzbfs.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

Uczyń go wykonywalnym:

$ chmod u+x ./bfs.sh

Następnie możesz znaleźć pierwsze znalezisko:

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

17

Możesz użyć-depth opcja umożliwiająca przetworzenie zawartości katalogu przed samym katalogiem. Możesz także użyć-maxdepth opcja ograniczenia liczby katalogów, które będą drążyć.

„rodzaj” ma rację - to nadal nie jest prawdziwe wyszukiwanie w pierwszej kolejności, ponieważ a / b / c będzie odwiedzane przed a / d. Jednak wystarczający do większości celów. ephemient
To nadal nie jest szerokie pierwsze wyszukiwanie. To po prostu ograniczone wyszukiwanie pierwszej głębokości. Pierwsze wyszukiwanie z ograniczoną głębokością rozwiązuje problem znalezienia „pliku, który nie jest tak odległy”, ale nie jest to zdecydowanie pierwsze wyszukiwanie. yiati
4

find z--maxdepth opcja.

To jest naKatalogi sekcja na stronie odniesienia; może znaleźć inne opcje bardziej odpowiednie w zależności od potrzeb.

Aby uzyskać dokładną szerokość pierwszego wyszukiwania, musisz zapętlić z mieszaniem--mindepth i--maxdepth opcje. Ale nie wydaje mi się, żeby było tak dokładnie, że zwykle wystarczy wyszukiwanie z ograniczoną głębią.

10

Straszny hack, nie zadziała-0 lub jakiekolwiek działania inne niż-print, nieefektywne itp. itd.…

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

Zasadniczo to po prostu działa

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

aż dofind zwraca stan niezerowy lub nic nie drukuje.

Wygląda jakiteracyjne wyszukiwanie głębokościowe Dla mnie... Matt Luongo
@ MooingDuck Nie zgodziłem się, że to działa, tylko wskazanie, że ma określoną nazwę. IDFS jest również wolniejszy niż BFS, ponieważ wymaga przemierzania poprzedniego poziomu na drzewie za każdym razem. Argument, który słyszałem, jest taki, że w większości problemów z wyszukiwaniem koszt czasu wykonywania jest zdominowany przez koszt przejazdun+1, więc często warto. Matt Luongo
@MattLuongo: Z twojego linku: „IDDFS jest odpowiednikiem pierwszego wyszukiwania, ale zużywa znacznie mniej pamięci;” Mooing Duck
Mini golf:for((i=0;1;i++));do find -mindepth $i -maxdepth $i|grep .||break;done Max Murphy
Należy jednak pamiętać, że jeśli wykonujesz jakiekolwiek znaczące przetwarzanie w każdym węźle, różnica między BFS a IDFS dla określonej przestrzeni wyszukiwania może być znacząca. Matt Luongo

Powiązane pytania