Liczba plików zawierających podany ciąg

19

Jak mogę policzyć liczbę plików (w katalogu) zawierających dany ciąg jako dane wejściowe w bash / sh?

Rozgwiazda
źródło

Odpowiedzi:

30

grep -l "string" * | wc -l wyszuka „ciąg” w treści wszystkich plików w katalogu roboczym i poda liczbę pasujących.

Wilk
źródło
1
To nie zadziała, jeśli w katalogu jest dużo plików, wygeneruje błąd „zsh: lista argumentów za długa: grep”. Wszelkie pomysły, jak się tego pozbyć?
1
@ user16142 grep katalog zamiast plików: grep -lr "string" directory | wc -lJeśli nie chcesz wyszukiwania rekurencyjnego, możesz użyć opcji find z opcją maxdepth: find directory -maxdepth 1 -type f -exec grep -l "string" {} + | wc -lPamiętaj, że ta druga opcja jest wolniejsza niż grep.
Agargara,
9

grepParametr s -lwyświetli tylko pasujące nazwy plików $PATTERN, wcmoże je później policzyć.

grep -l "$PATTERN" * | wc -l
machać
źródło
dzięki, ale zastanawiałem się nad wzorem w pliku ... przepraszam za dwuznaczne pytanie
Jeśli tak, weź odpowiedź Wolfa.
mach
3
awk '/pattern_to_look_for/ {s+=1; nextfile;} END {print s}' *

Wyjaśnienie: Wyszukuje liczbę plików, które mają „pattern_to_look_for” w swojej zawartości, a nie w nazwach plików (jak odpowiedź Waga). Z twojego pytania trudno jest powiedzieć, czego szukasz.

Jan Persson
źródło
Ale czegoś brakuje? ponieważ to nie działa
Jeśli szukasz kaczki sznurkowej, musisz napisać ją jak / duck / w Awk. Robisz to
Jan Persson
tak, wynik: awk: błąd odczytu (jest katalogiem)
Odpowiedź Wolfa da ci duplikaty. Jeśli w jednym z plików występuje kilka wystąpień szukanego ciągu, będzie on liczony jako dodatkowe dopasowanie.
Jan Persson
Cóż, jeśli masz katalogi w folderze, musisz zrobić kilka dodatkowych rzeczy, takich jak zastąpienie gwiazdy czymś takim find . ! -name . -prune -type f(nie przegap backsticksa). To polecenie wyświetla tylko pliki w folderze.
Jan Persson
2

Działa to w Bash z dowolną nazwą pliku:

grep -lZ "$pattern" * | tr -cd '\000' | wc -c

Wyjaśnienie:

  • grep„s -Zopcja drukuje każdy wynik z separatorem ␀ bajtów. Ten znak nie może być częścią nazwy pliku, więc możemy po prostu policzyć liczbę separatorów, aby uzyskać liczbę plików.
  • Aby pozbyć się innych znaków na wyjściu, po prostu usuwamy wszystko oprócz ␀ bajtów za pomocą tr.
  • Następnie policz znaki za pomocą wc.
10b0
źródło