Jak policzyłbyś każde wystąpienie terminu we wszystkich plikach w bieżącym katalogu? - i podkatalogi (?)
Przeczytałem o tym, że użyłbyś tego grep
; jakie jest dokładne polecenie?
Czy jest to również możliwe przy użyciu innego polecenia?
command-line
files
directory
grep
Powiedz mi dlaczego
źródło
źródło
PCREs
nie należy go stosować, ponieważ są eksperymentalne-F
będzie prawdopodobnie szybciej.-F
zamiast-P
. Dzięki za świetną sugestię, aktualizację za pomocą-F
, która rzeczywiście pasuje tutaj lepiej.grep -Rc [term] *
zrobi to.-R
Flaga oznacza, że chcesz rekurencyjnie przeszukać bieżącym katalogu i wszystkich jego podkatalogów. Jest*
to selektor plików, który oznacza: wszystkie pliki.-c
Flag sprawiagrep
tylko wyjście liczbę wystąpień. Jeśli jednak słowo występuje wiele razy w jednym wierszu, jest liczone tylko raz.Od
man grep
:Jeśli w katalogu nie ma dowiązań symbolicznych, nie ma różnicy.
źródło
-c
flagę dogrep
. Wtedy grep się liczy i nie potrzebujeszwc
--
wcześniej*
*
Wzrośnie tylko do osób niebędących dotfiles, więc pominięcia wszystkich tych. Bardziej sensowne jest po prostu użycie „”. ponieważ i tak będziesz przetwarzał argumenty rekurencyjnie - i to dostanie pliki kropkowe. Większy problem polega na tym, że może to oznaczać liczbę wierszy, a nie liczbę wystąpień słowa. Jeśli termin pojawia się wiele razy w jednym wierszu, zostanie policzony tylko raz przez „grep -c”W małym skrypcie python:
count_string.py
.Uruchom go z katalogu za pomocą polecenia:
Notatki
Wyjaśnienie:
źródło
root
if
do?root
to ścieżka do pliku, w tym „powyżej” bieżącego katalogu,f
to plik. Alternatywnie,os.path.join()
można użyć, ale jest bardziej szczegółowy.n = n + open(f).read().count(s)
?Jako wariant ładnej odpowiedzi @ kos, jeśli chcesz wyszczególnić liczby, możesz użyć
-c
przełącznika grep do liczenia wystąpień:źródło