다음 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)로 끝납니다. 이는 파일 이름 목록이 너무 길어서 명령줄 길이 제한을 초과할 수 있는 경우에 유용합니다. 이 경우
wc
via를 실행하는xargs
것은 목록을 여러 부분으로 나누고wc
전체 목록 대신 각 하위 목록의 합계를 인쇄하므로 권장되지 않습니다. ASCII NUL 종료 파일 이름 목록을 생성하는 한 가지 방법은 조건자를find
사용하여 GNU를 사용하는 것입니다-print0
. 만약에문서"-"인 경우 ASCII NUL 종료 파일 이름을 표준 입력에서 읽습니다.
이 옵션을 지원하지 않는 경우 wc
모든 "전체" 행을 추출하고 합산하는 간단한 스크립트를 통해 출력을 보낼 수 있습니다.
... | awk '$2=="total"{t=t+$1} END{print t " total"}'
답변2
파일이 너무 많기 때문에 발생하는 문제 wc -l
는 xargs
기본적으로 xargs
모든 파일을 한 번에 호출하는 것이 wc -l
명령이 너무 크기 때문에 작동하지 않는 것입니다. 당신이 보는 결과는마지막 배치. 수천 행 정도 위로 스크롤하면 결국 이전 배치의 결과가 표시됩니다.
모든 파일의 총 줄 수만 계산하는 경우 cat
해당 줄을 모두 삭제하고 해당 데이터를 다음으로 보낼 수 있습니다 wc -l
.
find . -type f -name '*.txt' -exec cat {} + | wc -l
이 작업은 cat
배치에서 발견된 파일에 대해 수행된 다음 결과 데이터 스트림이 wc -l
.