Muszę przeszukać pierwsze 50 wierszy każdego pliku w katalogu i jego podkatalogach.
Spowoduje to wykonanie części rekurencyjnej, ale jak ograniczyć się tylko do pierwszych 50 wierszy każdego pliku?
grep -r "matching string here" .
Niektóre z tych plików są ogromne i chcę je dopasowywać tylko w pierwszych 50 wierszach. Próbuję przyspieszyć ten proces, nie wyszukując megabajtów danych binarnych w niektórych plikach.
Odpowiedzi:
Jeśli chcesz tylko pasujących plików:
lub
Jeśli chcesz tylko pasujące ciągi:
albo lepiej,
A jeśli chcesz obu:
Uwagi
sed
zamiast kombinacjihead
-grep
.-exec ... +
każdej metody, ale wtedy będziesz musiał samodzielnie kodować swoją wewnętrzną pętlę! (trywialne ćwiczenie pozostawione czytelnikowi). Może to być nieco bardziej wydajne, jeśli masz pliki gazillion.źródło
Jeśli potrzebujesz wyjścia grep jak w oryginale, możesz:
Jeśli potrzebujesz tylko nazw plików, możesz zamienić drugi grep na
echo "$f"
.źródło
Musisz połączyć kilka różnych narzędzi, aby uzyskać pożądaną funkcjonalność. Użyj
find
polecenia, aby ponownie wyszukać katalogi, znaleźć wszystkie pliki i wykonaćhead
polecenie dla każdego znalezionego pliku.head
Komenda może być użyta do zrzutu tylko pierwsze 50 linii każdego pliku. Na koniec potokuj wyjście do grep, aby wyszukać żądany ciąg.find . -type f -exec head -n 50 {} ";" | grep "matching string here"
źródło