파일 시스템 트리에서 문자 발생 횟수를 계산합니다.

파일 시스템 트리에서 문자 발생 횟수를 계산합니다.

작업은 디렉터리의 모든 파일에서 문자 "a"가 나타나는 횟수를 (재귀적으로) 찾는 것입니다.

내 스크립트는 다음과 같습니다

find . -type f -exec grep -o 'a' {} \; 2>/dev/null | wc -l

하지만 실패합니다. 내 로컬 컴퓨터에서도 작동하고 결과는 0입니다.

이 스크립트에 어떤 문제가 있나요? 방탄이나 그런 건 아닌 것 같아요. 어떻게 방탄하거나 올바르게 만들 수 있습니까?

답변1

내 생각에는 문제의 컴퓨터가 grep-o를 지원하지 않는 것 같습니다.

이 경우 명령줄은 find실행할 때마다 오류 메시지를 생성합니다 grep. 그러나 표준 오류가 /dev/null로 리디렉션되면서 사람들의 비명은 귀에 들리지 않게 되었습니다.

wcgrep단일 바이트가 수신되지 않아 즉시 종료되었기 때문에 줄 수가 0이 됩니다 .

stderr 리디렉션이나 로그 파일로 리디렉션하지 않고 파이프라인을 실행해 보세요. 제 말이 맞다면 발견된 각 파일에 대해 하나의 오류 메시지가 표시되어야 합니다 find.

유용하다고 생각되면 작동하지 않는 대안은 다음과 같습니다 grep.

find . -type f -exec cat {} \; | tr -cd a | wc -m

find보다 효율적인 +실행 대안을 지원 하는 경우 :

find . -type f -exec cat {} + | tr -cd a | wc -m

답변2

나는 이걸했다:

find "${directory-.}" -type f -print0 | xargs -0 -r cat | grep -F -o 'a' | wc -l

이는 명령과 거의 동일하며 0이 아닌 결과를 얻습니다. 당신이 생각하는 디렉토리에 있습니까? 정말 찾고 계시나요 a? 그렇지 않은 경우 grep -F(사용 중인 경우) fgrep정규식 대신 고정 문자열을 검색하는 것이 좋습니다 .

grep -r(recursive grep)을 사용하면 더욱 단순화 할 수 있습니다 .

grep -Fro 'a' "${directory-.} | wc -l

grep불행하게도 발생 횟수 대신 행이 계산되므로 계산을 수행 할 수 없습니다 grep -o -c. 이는 버그라고 생각합니다.

관련 정보