读取行时在外部 bash 中求和

读取行时在外部 bash 中求和

我正在尝试计算.js文件夹中文件的行数总和。我在 bash 中使用这个:

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

$sum += $1把里面的东西放在里面awk是行不通的。我该怎么做?

PS:我知道使用这可以更容易地实现

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

我还是想要上面的解决方案。

答案1

尝试这个简单且超快速的解决方案:

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

wc之前尝试过一些解决方案,但它们会遇到问题,例如文件名中的换行符和/或速度很慢。

答案2

bash 在单独的子 shell 中执行管道的每个命令,除非启用lastpipeshell 选项

# 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

流程替代可以很方便地处理这个子shell问题:

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 #

相关内容