주어진 문자열을 포함하는 파일 수


19

주어진 문자열을 포함하는 파일 (디렉토리에서)을 bash / sh의 입력으로 계산하는 방법은 무엇입니까?

답변:


30

grep -l "string" * | wc -l 작업 디렉토리의 모든 파일 내용에서 "문자열"을 검색하고 일치하는 수를 알려줍니다.


1
디렉토리에 많은 파일이 있으면 작동하지 않습니다. "zsh : argument list too long : grep"오류가 발생합니다. 이것을 제거하는 방법에 대한 아이디어가 있습니까?

1
@ user16142 파일 대신 디렉토리를 grep합니다. grep -lr "string" directory | wc -l재귀 검색을 원하지 않으면 maxdepth 옵션과 함께 find를 사용할 수 있습니다. find directory -maxdepth 1 -type f -exec grep -l "string" {} + | wc -l이 두 번째 옵션은 grep보다 느립니다.
Agargara

9

grep의 매개 변수 -l만 출력 매칭되는 파일 이름은 것 $PATTERN, wc나중에 그들을 셀 수 있습니다.

grep -l "$PATTERN" * | wc -l

감사하지만 파일에 패턴이 궁금했습니다 ... 모호한 질문에 대해 죄송합니다

그렇다면 Wolf의 답을 얻으십시오.
wag

3
awk '/pattern_to_look_for/ {s+=1; nextfile;} END {print s}' *

설명 : 파일 이름이 아닌 내용에 "pattern_to_look_for"가있는 파일 수 (Wag의 답변 등)를 찾습니다. 당신의 질문에서 당신이 찾고있는 것을 말하기는 어렵습니다.


하지만 뭔가 빠졌습니까? 작동하지 않기 때문에

문자열 오리를 찾으면 Awk에서 / duck /와 같이 써야합니다. 그렇게하고 있습니까?
Jan Persson

예, 출력 : awk : 읽기 오류 (디렉토리 임)

울프의 대답은 당신에게 중복을 줄 것입니다. 파일 중 하나에서 찾고있는 문자열이 여러 번 발생하면 추가 일치 항목으로 계산됩니다.
Jan Persson

폴더에 디렉토리가 있다면 별을 이와 같은 것으로 바꾸는 것과 같은 추가 작업을 수행해야합니다 find . ! -name . -prune -type f(백틱을 놓치지 마십시오). 이 명령은 폴더의 파일 만 나열합니다.
Jan Persson

2

이것은 모든 파일 이름 으로 Bash에서 작동합니다 .

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

설명:

  • grep-Z선택은 ␀ 바이트 세퍼레이터 모든 결과를 출력한다. 이 문자는 파일 이름의 일부가 될 수 없으므로 구분자 수를 세어 파일 수를 얻을 수 있습니다.
  • 출력에서 다른 문자를 제거하려면을 사용하여 ␀ 바이트를 제외한 모든 문자를 제거 하면 됩니다 tr.
  • 그런 다음 문자를로 계산하십시오 wc.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.