Chciałbym użyć „znajdź” i zlokalizuj ”do wyszukiwania plików źródłowych w moim projekcie, ale ich uruchomienie zajmuje dużo czasu. Czy są szybsze alternatywy dla tych programów, o których nie wiem, lub sposoby na przyspieszenie wydajności tych programów?
22
locate
powinien już być dość szybki, biorąc pod uwagę, że korzysta z gotowego indeksu (głównym zastrzeżeniem jest to, że musi być aktualizowany), podczas gdyfind
musi czytać katalogi.find /usr/src -name fprintf.c
na komputerze stacjonarnym OpenBSD, zwraca lokalizację tych plików źródłowych w mniej niż 10 sekund.locate fprintf.c | grep '^/usr/src.*/fprintf.c$'
wraca w niecałą sekundę. Jaka jest twoja definicja „długi czas uruchamiania” i jak można wykorzystaćfind
ilocate
?Odpowiedzi:
Wyszukiwanie plików źródłowych w projekcie
Użyj prostszego polecenia
Ogólnie rzecz biorąc, źródło projektu prawdopodobnie znajduje się w jednym miejscu, być może w kilku podkatalogach zagnieżdżonych nie więcej niż dwa lub trzy głębokie, więc możesz użyć (prawdopodobnie) szybszego polecenia, takiego jak
Skorzystaj z metadanych projektu
W projekcie C zazwyczaj masz plik Makefile. W innych projektach możesz mieć coś podobnego. Mogą to być szybki sposób na wyodrębnienie listy plików (i ich lokalizacji), napisanie skryptu, który wykorzystuje te informacje do zlokalizowania plików. Mam skrypt „źródeł”, dzięki czemu mogę pisać polecenia takie jak
grep variable $(sources programname)
.Przyspieszenie wyszukiwania
Wyszukaj mniej miejsc, zamiast
find / …
używaćfind /path/to/project …
tam, gdzie to możliwe. Uprość kryteria wyboru w jak największym stopniu. Użyj potoków, aby odroczyć niektóre kryteria wyboru, jeśli jest to bardziej wydajne.Możesz także ograniczyć głębokość wyszukiwania. Dla mnie to znacznie poprawia szybkość „znajdowania”. Możesz użyć przełącznika -maxdepth. Na przykład „-maxdepth 5”
Przyspieszenie zlokalizować
Upewnij się, że indeksuje lokalizacje, które Cię interesują. Przeczytaj stronę podręcznika i skorzystaj z opcji odpowiednich dla twojego zadania.
Usuń potrzebę wyszukiwania
Może szukasz, bo zapomniałeś, gdzie coś jest lub nie zostało powiedziane. W pierwszym przypadku pisz notatki (dokumentację), w drugim pytaj? Konwencje, standardy i spójność mogą bardzo pomóc.
źródło
Użyłem części „przyspieszenie lokalizacji” odpowiedzi RedGrittyBrick. Utworzyłem mniejszą db:
następnie wskazał
locate
na to:locate -d /home/benhsu/ben.db
źródło
Taktyką, której używam, jest zastosowanie
-maxdepth
opcji zfind
:Powtarzaj z coraz większą głębokością, aż znajdziesz to, czego szukasz, lub zmęczysz się szukaniem. Pierwsze kilka iteracji prawdopodobnie powróci natychmiast.
Zapewnia to, że nie marnujesz czasu z góry na przeglądanie głębokich masywnych sub-drzew, gdy bardziej prawdopodobne jest, że to, czego szukasz, będzie blisko podstawy hierarchii.
Oto przykładowy skrypt automatyzujący ten proces (Ctrl-C, gdy zobaczysz, co chcesz):
Zauważ, że związana z tym nadmiarowość (każde przejście będzie musiało przechodzić przez foldery przetwarzane w poprzednich przebiegach) zostanie w dużej mierze zoptymalizowane poprzez buforowanie dysku.
Dlaczego
find
ta kolejność wyszukiwania nie jest funkcją wbudowaną? Może dlatego, że byłoby to skomplikowane / niemożliwe do wdrożenia, gdyby założyć, że zbędne przejście było niedopuszczalne. Istnienie-depth
opcji wskazuje na taką możliwość, ale niestety ...źródło
Innym łatwym rozwiązaniem jest użycie nowszego rozszerzonego globowania powłoki. Umożliwić:
Następnie możesz uruchomić takie polecenia w katalogu źródłowym najwyższego poziomu:
Ma to tę zaletę, że przeszukuje rekurencyjnie wszystkie podkatalogi i jest bardzo szybkie.
źródło
Srebrny Poszukiwacz
Może się okazać, że przydaje się ono do bardzo szybkiego wyszukiwania zawartości ogromnej liczby plików kodu źródłowego. Po prostu wpisz
ag <keyword>
. Oto niektóre z moich wynikówapt show silversearcher-ag
:Zwykle używam go z:
źródło
.gitignore
pliki i przeskakuje.git
,.svn
,.hg
.. foldery..gitignore
domyślnie honoruje i ignoruje również pliki ukryte i binarne. Mają także więcej współpracowników, więcej gwiazd na Githubie (14700 vs 8300) i jest już na repozytorium dystrybucji burmistrza. Podaj zaktualizowane wiarygodne porównanie źródeł innych firm. Niemniej jednakripgrep
wygląda świetnie na oprogramowanie.ripgrep
w żaden sposób powiązany z autorem (autorami) , to po prostu pasuje do moich wymagań, więc przestałem szukać innych opcji..gitignore
też szanuje . To powiedziawszy,rg
jest absolutnie niesamowite. Po pierwsze, ma obsługę Unicode. Z mojego doświadczeniarg
konsekwentnie co najmniej dwa razy szybszego niżag
(YMMV), wydaje mi się, że jest to spowodowane parserem wyrażeń regularnych Rora, który oczywiście nie był jeszcze gotowy w latach, któreag
były nowe.rg
może dawać deterministyczne dane wyjściowe (ale domyślnie tego nie robi), może umieszczać na czarnej liście typy plików, na którychag
może znajdować się tylko na białej liście, może ignorować pliki na podstawie rozmiaru (dzienniki pa). Nadal używamag
na wypadek, gdy potrzebuję dopasowania wieloliniowego, czegorg
nie można zrobić.Aby znaleźć zamiennik, sprawdź fd . Ma prostszy / bardziej intuicyjny interfejs niż oryginalne polecenie find i jest nieco szybszy.
źródło