find 명령의 각 결과에 대해 어떻게 wc를 실행합니까?

find 명령의 각 결과에 대해 어떻게 wc를 실행합니까?

이 명령을 사용하여 찾은 각 파일에 몇 줄이 있는지 확인하고 싶습니다 find.

나는 이것을 사용하여 wc -l단일 파일의 줄 번호를 찾을 수 있다는 것을 알고 있습니다. 그러나 다음 출력에서 ​​파이핑할 때는 작동하지 않습니다 find.

find -type f -name package.json | wc -l

그러면 발견된 파일 수가 반환됩니다. 발견된 각 파일의 줄 수를 반환하고 싶습니다.

답변1

wcw바이트/문자/명령/줄 개수가 있는 c파일 목록을 가져옵니다.논쟁.

인수 없이 호출되면 표준 입력에 이러한 바이트/문자/단어/줄을 보고합니다. 따라서 로 파이프하면 findwc -l출력에서 ​​개행 수를 얻게 되므로 find이는 발견된 파일 수에 해당 경로의 개행 수를 더한 값이 됩니다.

GNU 구현에서는 wc이 옵션을 사용하여 file 에서 NUL로 구분된 파일 목록을 가져올 수도 있습니다 --files0-from. 이는 -stdin이라는 파일 대신 stdin을 의미하는 것으로 간주되므로 -다음을 수행할 수 있습니다.

find . -name package.json -type f -print0 |
  wc -l --files0-from=-

표준 find이나 구현을 사용하여 파일 경로 목록을 전달할 wc수 있습니다.find매개변수로그리고 wc:

find . -name package.json -type f -exec wc -l {} +

그러나 일치하는 파일이 많으면 wc여러 번 실행하게 되어 행이 여러 번 나타날 수 있습니다 total.

wctotal이 줄은 처리할 파일이 2개 이상 제공되면 인쇄되므로 이 total줄을 건너뛰려면 다음을 수행할 수 있습니다.

find . -name package.json -type f -exec wc -l {} ';'

프로세스를 분기하고 각 파일에 대해 명령을 실행하는 데 비용이 많이 들기 때문에 이는 매우 비효율적입니다.

이것이 정말로 관심이 있는 합계라면 다음과 같이 하십시오.

find . -name package.json -type f -exec cat {} + | wc -l

우리는 cat이러한 파일의 내용에 대한 링크를 에 제공합니다 wc.

zsh및 any 를 사용하면 wc다음을 수행할 수 있습니다.

wc -l -- **/package.json(D.)

( otglob의 경우 dos처럼 숨길 D수도 있고 다음 내용만 포함할 수도 있습니다.Dfind.정기적인해당 파일 -type f).

이는 정렬된 목록을 제공하고 접두어를 피할 수 있다는 장점이 있습니다 ./.

이번에는 일치하는 파일이 없거나 너무 많으면 오류가 발생합니다.

GNU를 사용하면 duNUL로 구분된 glob 확장을 다음과 같이 전달하여 이러한 문제를 피할 수 있습니다 wc -l --files0-from=-.

print -rNC1 -- **/package.json(ND.) | wc -l --files0-from=-

또한 json 형식에서는 개행(중요 wc -l)이 중요하지 않으므로 이것이 유용한 측정항목인지 확실하지 않습니다.

예를 들어 다음 파일의 일부 배열에 있는 요소 수를 대신 반환할 수 있습니다.

find . -name package.json -type f -exec \
  jq -r '[.devDependencies|length,input_filename]|@csv' {} +

(파일 경로가 UTF-8로 인코딩된 텍스트라고 가정하면 결과는 여기에 CSV 형식으로 제공됩니다.)

답변2

xargs다음을 사용하여 표준 입력을 필수 인수 벡터로 파이프 할 수 있습니다 .

find -type f -name package.json | xargs wc -l

또는 단순히 쉘 명령 대체를 통해 이를 채우도록 하십시오.

wc -l $(find -type f -name package.json)

관련 정보