wc를 사용하여 행 수를 재귀적으로 계산할 때 잘못된 결과가 발생함

wc를 사용하여 행 수를 재귀적으로 계산할 때 잘못된 결과가 발생함

다음 Linux 명령을 사용하여 폴더 구조에서 텍스트 파일의 줄 수를 재귀적으로 계산합니다.

find . -name '*.txt' | xargs -d '\n' wc -l

그러면 발견된 모든 파일과 해당 줄 번호가 출력됩니다.

  86 ./folder1/folder11/folder111/file1.txt
  67 ./folder1/folder11/folder112/file2.txt
7665 ./folder1/folder11/folder113/file3.txt
..., etc.
1738958 total

총 24,000개 이상의 파일이 있습니다. 각 파일의 줄 수가 정확하고 모든 파일이 소유됩니다. 그러나 총 행 수가 올바르지 않습니다. 이 구조화된 하위 폴더의 경우에도 총 행 수가 훨씬 더 많습니다. 예를 들어:

cd folder1/folder11
find . -name '*.txt' | xargs -d '\n' wc -l

마지막으로 23M 라인 제공:

22535346 total

모든 행의 총 개수는 1.7M이 아니라 100M보다 커야 합니다. 내가 여기서 무엇을 놓치고 있는 걸까요?

답변1

GNU가 있는 경우 wc다음을 사용하십시오.

find . -name "*.txt" -print0 | wc -l --files0-from -

이것이 옵션에 대한 매뉴얼 섹션현재 수행 중인 작업이 작동하지 않는 이유를 설명합니다.

‘--files0-from=file’

명령줄에 지정된 파일 처리를 비활성화하고 대신 file에 지정된 파일을 처리합니다.문서;각 이름은 0바이트(ASCII NUL)로 끝납니다. 이는 파일 이름 목록이 너무 길어서 명령줄 길이 제한을 초과할 수 있는 경우에 유용합니다. 이 경우 wcvia를 실행하는 xargs것은 목록을 여러 부분으로 나누고 wc전체 목록 대신 각 하위 목록의 합계를 인쇄하므로 권장되지 않습니다. ASCII NUL 종료 파일 이름 목록을 생성하는 한 가지 방법은 조건자를 find사용하여 GNU를 사용하는 것입니다 -print0. 만약에문서"-"인 경우 ASCII NUL 종료 파일 이름을 표준 입력에서 읽습니다.

이 옵션을 지원하지 않는 경우 wc모든 "전체" 행을 추출하고 합산하는 간단한 스크립트를 통해 출력을 보낼 수 있습니다.

... | awk '$2=="total"{t=t+$1} END{print t " total"}'

답변2

파일이 너무 많기 때문에 발생하는 문제 wc -lxargs기본적으로 xargs모든 파일을 한 번에 호출하는 것이 wc -l명령이 너무 크기 때문에 작동하지 않는 것입니다. 당신이 보는 결과는마지막 배치. 수천 행 정도 위로 스크롤하면 결국 이전 배치의 결과가 표시됩니다.

모든 파일의 총 줄 수만 계산하는 경우 cat해당 줄을 모두 삭제하고 해당 데이터를 다음으로 보낼 수 있습니다 wc -l.

find . -type f -name '*.txt' -exec cat {} + | wc -l

이 작업은 cat배치에서 발견된 파일에 대해 수행된 다음 결과 데이터 스트림이 wc -l.

관련 정보