줄을 읽을 때 외부 bash의 합계

줄을 읽을 때 외부 bash의 합계

.js폴더에 있는 파일의 줄 수의 합을 계산하려고 합니다 . 나는 이것을 bash에서 사용합니다:

sum=0 && find . | grep ".js" | while read -r f; do wc -l $f | awk '{print $1;}'; done;

$sum += $1내용물을 넣어도 awk소용이 없습니다. 어떻게 해야 합니까?

추신: 이것을 사용하면 달성하기가 더 쉽다는 것을 알고 있습니다.

find . -name '*.js' | xargs wc -l

나는 여전히 위의 솔루션을 원합니다.

답변1

다음의 간단하고 초고속 솔루션을 사용해 보세요.

find . -type f -name "*.js" -exec cat {} + | wc -l

이전에 몇 가지 해결 방법을 시도 했지만 wc파일 이름에 줄 바꿈 등의 문제가 발생했거나 속도가 느렸습니다.

답변2

lastpipebash는 셸 옵션이 활성화 되지 않은 한 별도의 하위 셸에서 파이프라인의 각 명령을 실행합니다.

# bash requires job control to be disabled for lastpipe setting
set +m
shopt -s lastpipe

declare -i sum=0
find . -name '*.js' -print0 | while IFS= read -d '' -r name; do
    (( sum += $(wc -l < "$name") ))   # redirect the file into wc for easier output
done
echo $sum

프로세스 교체이 서브쉘 문제는 매우 편리하게 처리될 수 있습니다.

declare -i sum=0
while IFS= read -d '' -r name; do
    (( sum += $(wc -l < "$name") ))   # redirect the file into wc for easier output
done < <(
    find . -name '*.js' -print0
)
echo $sum

그러나 이로 인해 프로그램 흐름을 읽기가 더 어려워집니다.

답변3

awk추가하고 결과를 표시 하시겠습니까 ?

awk '{sum +=$1} END {print sum}'그러면 문제가 해결될 것입니다.

내 Bash 스크립트 라이브러리에서는 다음을 수행합니다.

$ find . -type f -name '*.bash' \
| while read -r f ; do wc -l "$f" ; done \
| awk '{sum +=$1} END {print sum}'

그리고 결과를 얻으세요522

답변4

또 다른 bash 접근 방식은 다음과 같습니다.

sum=0 && while IFS= read -r -d '' f; do let sum+=$(sed -n "\$=" "${f}"); done < <(find . -name '*.js' -print0 2>/dev/random) && echo "$sum"

find ... -print0 -- prints with null terminated 
            IFS= -- deset IFS 
   read -r -d '' -- -r do not allow backslash escapes, -d '' set delimiter to NULL
   let sum+=(..) -- add up sum of sed $= "$f", $: last line, =: line #

관련 정보