.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
lastpipe
bash는 셸 옵션이 활성화 되지 않은 한 별도의 하위 셸에서 파이프라인의 각 명령을 실행합니다.
# 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 #