我正在尝试计算.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 中执行管道的每个命令,除非启用lastpipe
shell 选项
# 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 #