Mam następujące polecenie
find /var -type f -exec grep "param1" {} \; -print
Za pomocą tego polecenia mogę znaleźć ciąg param1 w dowolnym pliku w katalogu / var, ale czas potrzebny na to jest bardzo długi.
Potrzebuję innej możliwości znalezienia ciągu w pliku, ale znacznie szybciej niż w moim przykładzie
Odpowiedzi:
Możesz spróbować użyć grep bezpośrednio jak w
źródło
grep -R "param1" /var
-l
opcji drukowania tylko nazw pasujących plików zamiast rzeczywistych pasujących linii w plikach.szybkie wyszukiwanie uzyskuje się głównie poprzez „indeks” treści, rodzaj „tablicy odnośników”. istnieją pewne bezpłatne wyszukiwarki, które budują indeks plików wejściowych i dają bardzo, bardzo szybkie wyniki:
wątpię, czy chcesz pójść tą drogą, ale po prostu dać ci inną opcję :)
źródło
Istnieje tu kilka czynników:
Po pierwsze , za pomocą
-exec
find znajduje nowy procesgrep
dla każdego znalezionego pliku.Można to zarządzać albo za pomocą xargs, jak w odpowiedzi Felipe Alvareza (napisałem wpis na blogu o tym ponad 5 lat temu) lub za pomocą
-exec grep param1 {} +
(zwróć uwagę na+
zamiast\;
). Podczas używania+
„linia poleceń jest budowana poprzez dołączenie na końcu każdej wybranej nazwy pliku; całkowita liczba wywołań polecenia będzie znacznie mniejsza niż liczba pasujących plików” (ze strony podręcznika wyszukiwania )Po drugie , liczba i rozmiar plików poniżej
/var
jest potencjalnie bardzo duża.Czy możesz dodatkowo dodać parametry,
-type f
aby ograniczyć wyszukiwanie plików?find
ma opcje ograniczania czasu, właściciela, wzorca nazwy itp. Na przykład możesz:Dzięki temu pliki zmodyfikowane w ciągu ostatnich siedmiu dni będą miały nazwy zaczynające się od „access” i kończące się na „log”. Tylko te pasujące pliki będą częścią exec / grep.
źródło
znajdź ... [bla] ..... -print0 | xargs -0 grep -e „regex”
źródło
Radzę używać:
Aby uzyskać więcej informacji zobacz
Jeśli prędkość ma tak duże znaczenie, możesz rozważyć użycie fgrep, który może nie okazać się szybszy w zależności od implementacji.
źródło