작업은 디렉터리의 모든 파일에서 문자 "a"가 나타나는 횟수를 (재귀적으로) 찾는 것입니다.
내 스크립트는 다음과 같습니다
find . -type f -exec grep -o 'a' {} \; 2>/dev/null | wc -l
하지만 실패합니다. 내 로컬 컴퓨터에서도 작동하고 결과는 0입니다.
이 스크립트에 어떤 문제가 있나요? 방탄이나 그런 건 아닌 것 같아요. 어떻게 방탄하거나 올바르게 만들 수 있습니까?
답변1
내 생각에는 문제의 컴퓨터가 grep
-o를 지원하지 않는 것 같습니다.
이 경우 명령줄은 find
실행할 때마다 오류 메시지를 생성합니다 grep
. 그러나 표준 오류가 /dev/null로 리디렉션되면서 사람들의 비명은 귀에 들리지 않게 되었습니다.
wc
grep
단일 바이트가 수신되지 않아 즉시 종료되었기 때문에 줄 수가 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
. 이는 버그라고 생각합니다.