파일 시스템 트리에서 문자 발생 횟수 계산

파일 시스템 트리에서 문자 발생 횟수 계산

작업은 디렉터리의 모든 파일에서 'a' 문자가 나타나는 횟수를 (반복적으로) 찾는 것이었습니다.

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

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

하지만 실패했습니다. 로컬 컴퓨터에서도 결과가 0으로 표시되었습니다.

이 스크립트에 어떤 문제가 있나요? 방탄이나 그런 건 아닌 것 같아요. 어떻게 하면 그것을 방탄으로 만들거나 바로잡을 수 있을까요?

답변1

내 생각에는 문제가 있는 시스템이 grep-o를 지원하지 않는 것 같습니다.

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

wcgrep은(는) 즉시 종료되므로 단일 바이트를 수신하지 않아 줄 수가 0이 됩니다 .

stderr 리디렉션 없이 또는 로그 파일로의 리디렉션을 사용하여 파이프라인을 실행해 보세요. 내 말이 맞다면 에서 찾은 파일당 하나의 오류 메시지가 표시되어야 합니다 find.

유용하다고 생각되는 경우 다음을 사용하지 않는 대안이 있습니다 grep.

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

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

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. 저는 이를 버그라고 생각합니다.

관련 정보