find 명령을 사용하여 줄 수를 찾으십시오.

find 명령을 사용하여 줄 수를 찾으십시오.

다음 위치에 있는 R 소스 코드 저장소를 고려해보세요.https://cloud.r-project.org/src/base/R-3/R-3.4.4.tar.gz. 저장소를 폴더에 압축을 풀었습니다. 이제 디렉토리에 몇 줄이 있는지 알고 싶습니다. 그래서 다음 명령을 시도했습니다.

find . -type f -exec wc -l {} \+

394968이 생성되지만 다음 명령을 시도하면:

find . -type f -exec cat {} \+ | wc -l

1848857이 생성됩니다!

비슷해 보이는 두 가지 명령 작업이 왜 find그렇게 크게 다른 결과를 낳습니까? 그리고 가젯 스크립트를 작성하는 대신 명령줄 유틸리티를 사용하여 줄 수를 찾는 올바른 방법은 무엇입니까?

답변1

언급한 첫 번째 명령은 find . -type f -exec wc -l {} +실제로 " wc -l모든 파일이 처리될 때까지 가능한 한 많은 파일을 실행"이라고 말합니다. wc여러 번 실행할 수 있습니다 !

반면에 여러 번 find . -type f -exec cat {} + | wc -l실행할 수 있지만 한 번만 cat실행됩니다 wc. (자세히 말하면 이 경우 cat호출하면 find원하는 횟수에 관계없이 실행하기로 결정할 수 있고 실행하기로 결정했으며 파이프 문자 다음 부분은 wc -l범위를 벗어나 find므로 실행 여부는 사용자에게 달려 있기 때문입니다. 껍질은 한 번만.)

첫 번째 명령은 "394968을 생성합니다"라고 말했지만 내 시스템에서는 출력이 다음과 같이 끝나지 않습니다.

(Many more lines elided...)
     23 ./po/Makefile.win
     64 ./po/README
      1 ./VERSION-NICK
     97 ./README
 258450 total

그러나 를 추가하면 실제로 두 번 실행되는 grep total것을 볼 수 있습니다 wc.

$ find . -type f -exec wc -l {} + | grep total
 1590407 total
 258450 total

실제로 1590407에 258450을 더하면 1848857이 되며 이는 두 번째 명령과 일치합니다.


wc이 버전의 명령이 여러 번 실행되는 이유에 대한 모호한 힌트 설명find -exec wc +매뉴얼 페이지 찾기:

-exec command {} +

    -exec작업의 변형은 선택한 파일에 대해 지정된 명령을 실행하지만 명령줄은 선택한 각 파일 이름을 끝에 추가하여 구성됩니다. 명령의 총 호출 수는 일치하는 파일 수보다 훨씬 적습니다. 명령줄은 xargs해당 명령줄과 거의 동일한 방식으로 구축됩니다.

이는 "한 번만"이 아니라 "...보다 훨씬 적음"을 의미합니다. 이것 xargs에 대한 문서--max-chars사용자가 옵션을 설정하지 않으면 자동으로 설정됩니다.

--max-chars=max-chars
-s max-chars

    가장 많이 사용max-chars명령 및 초기 인수와 인수 문자열 끝의 종료 null 값을 포함하여 명령줄당 문자 수입니다. 허용되는 최대 값은 시스템에 따라 다르며 exec에 대한 매개변수 길이 제한에서 환경 크기, 2048바이트 여백을 뺀 값으로 계산됩니다. 값이 128KiB보다 크면 128KiB가 기본값으로 사용됩니다. 그렇지 않으면 기본값이 최대값입니다.

이는 단일 호출에서 전달할 수 있는 파일 이름의 수를 제한합니다 wc. 이는 많은 수의 파일에 대해 wc여러 호출이 발생하고 각 호출이 입력의 하나의 파티션에서 작동하는 이유를 설명합니다.

관련 정보