Próbuję znaleźć plik, który nie istnieje w moim katalogu domowym i wszystkich podkatalogach.
find ~/ -name "bogus"
przekazuje mi te informacje po kilku sekundach, ale menedżer plików KDEdolphin
potrzebował prawie 3 minuty, aby zrobić to samo. To odpowiada mojemu wcześniejszemu doświadczeniu z GNOMEbeagle
.
Jak radzi find
sobie z tym samym bardzo szybko, gdy wyszukiwanie graficzne (które jest bardziej intuicyjne w użyciu niż parametry wiersza poleceń) jest opóźnione?
find
performance
dolphin
Czerwony
źródło
źródło
locate
częściej niżfind
i jest to szybsze w ogromnym folderzelocate
jest naprawdę świetny do wyszukiwania plików, jest to trochę OT, ponieważ używa zupełnie innego podejścia:find
a narzędzia GUI, takie jak przeglądająDolphin
drzewo plików na żądanie, podczas gdylocate
używają wcześniej utworzonej struktury indeksu.Odpowiedzi:
Patrząc konkretnie na Dolphin z Baloo, wydaje się, że wyszukuje metadane każdego pliku w domenie wyszukiwania, nawet jeśli wykonujesz proste wyszukiwanie nazw plików. Kiedy prześledzić
file.so
proces, widzę wywołańlstat
,getxattr
igetxattr
znowu dla każdego pliku, a nawet do..
wpisów. Te wywołania systemowe pobierają metadane dotyczące pliku, który jest przechowywany w innym miejscu niż nazwa pliku (nazwa pliku jest przechowywana w zawartości katalogu, ale metadane znajdują się w i- węzle ). Wielokrotne sprawdzanie metadanych pliku jest tanie, ponieważ dane znajdowałyby się w pamięci podręcznej dysku, ale może istnieć znacząca różnica między pytaniem o metadane a nie pytaniem o metadane.find
jest znacznie mądrzejszy. Stara się unikać niepotrzebnych wywołań systemowych. Nie zadzwoni,getxattr
ponieważ nie wyszukuje na podstawie rozszerzonych atrybutów. Podczas przeglądania katalogu może być konieczne wywołanielstat
niepasujących nazw plików, ponieważ może to być podkatalog do przeszukiwania rekurencyjnego (lstat
jest to wywołanie systemowe, które zwraca metadane pliku, w tym typ pliku, taki jak zwykły / katalog / symlink /…). Jednakfind
ma optymalizacja: wie ile podkatalogów katalogu ma od jego liczby łącza i przestanie dzwonilstat
raz wie, że jest to ruch wszystkie podkatalogi. W szczególności w katalogu typu liść (katalogu bez podkatalogów),find
sprawdza tylko nazwy, a nie metadane. Ponadto niektóre systemy plików przechowują kopię typu pliku we wpisie katalogu, więcfind
nawet nie musi dzwonić,lstat
jeśli jest to jedyna potrzebna informacja.Jeśli uruchomisz
find
z opcjami wymagającymi sprawdzenia metadanych, wykona więcejlstat
połączeń, ale nadal nie wykonalstat
połączenia z plikiem, jeśli nie potrzebuje informacji (na przykład dlatego, że plik jest wykluczony na podstawie poprzedniego warunku dopasowanie do nazwy).Podejrzewam, że inne narzędzia wyszukiwania GUI, które odkrywają
find
koło, są mniej sprytne niż narzędzie wiersza poleceń, które zostało poddane dekadom optymalizacji. Przynajmniej Dolphin jest wystarczająco sprytny, aby korzystać z lokalizowanej bazy danych, jeśli wyszukujesz „wszędzie” (z ograniczeniem, które nie jest jasne w interfejsie użytkownika, że wyniki mogą być nieaktualne).źródło
2 + number of sub-directories.
Działa w systemach plików, które implementują błąd projektowy z systemu plików UNIX V7, ale nie we wszystkich systemach plików, ponieważ nie jest to wymóg POSIX . Jeśli chcesz uzyskać użyteczny numer wydajności dla GNU make, musisz określić-noleaf
, aby GNU make zachowywał się poprawnie.find
mógł mieć ten błąd już dawno temu, ale wątpię, abyś znalazł przypadek, w którym musisz określić to-noleaf
ręcznie. AFAICT, przynajmniej w Linuksiegetdents()
(i readdir ()) informuje, które pliki są plikami katalogowymi w UDF, ISO-9660, btrfs, które nie mają rzeczywistych.
lub..
wpisów ifind
zachowuje się tam OK. Czy znasz jeden przypadek, w którym GNUfind
wykazuje problem?find
. W każdym raziestrace -v
pokazuje, żegetdents()
poprawnie zwraca d_type = DT_DIR dla katalogów, więc GNU find nie musi używać sztuczki polegającej na liczeniu linków.