Bash 递归搜索.extension文件并打印找到的文件中的行数?

Bash 递归搜索.extension文件并打印找到的文件中的行数?,bash,shell,wc,Bash,Shell,Wc,我遇到了一个我正试图解决的问题,但如果不从一开始就做整件事,我想不出一个办法。我的脚本获取扩展名并递归搜索每个.extension文件,然后输出文件名:row:word。我想打印出在这些文件中找到的行-s的总数。使用现有的代码有什么方法可以做到这一点吗 for i in find . -name '*.$1'|awk -F/ '{print $NF}' do echo "$i:`wc -l <$i|bc`:`wc -w <$i|bc`">>temp.txt done

我遇到了一个我正试图解决的问题,但如果不从一开始就做整件事,我想不出一个办法。我的脚本获取扩展名并递归搜索每个.extension文件,然后输出文件名:row:word。我想打印出在这些文件中找到的行-s的总数。使用现有的代码有什么方法可以做到这一点吗

for i in find . -name '*.$1'|awk -F/ '{print $NF}'
do
  echo "$i:`wc -l <$i|bc`:`wc -w <$i|bc`">>temp.txt
done

sort -r -t : -k3 temp.txt

cat temp.txt

我想你就快到了,除非我在你的要求中遗漏了什么:

#!/bin/bash
total=0
for f in `find . -name "*.$1"` ; do
        lines=`wc -l < $f`
        words=`wc -w < $f`
        total=`echo "$lines+$total" | bc`
        echo "* $f:$lines:$words"
done
echo "# Total: $total"
编辑: 根据@Mark Setchel在评论中的建议,这是上述脚本的更完善版本:

#!/bin/bash
total=0
for f in `find . -name "*.$1"` ; do
        read lines words _ < <(wc -wl "$f")
        total=$(($lines+$total))
        echo "* $f:$lines:$words"
done
echo "# Total: $total"

Cheers

这是一个单行程序,打印每个文件中找到的行、文件的路径以及所有文件中找到的所有行的总和:

find . -name "*.go" -exec wc -l {} \; | awk '{s+=$1} {print $1, $2} END {print s}'
在本例中,如果将查找以*.go结尾的所有文件,则将执行use wc-l以获取行数并将输出打印到stdout,然后使用awk对变量s中第1列的所有输出求和。仅在末尾打印一个:end{print s}

如果您还想得到最后的单词和总数,您可以使用:

find . -name "*.go" -exec wc {} \; | \
    awk '{s+=$1; w+=$2} {print $1, $2, $4} END {print "Total:", s, w}'

希望这能让您了解如何格式化、求和等。您的数据基于输入。

单引号内的字符串不会插入。您确定需要搜索扩展名为$1的文件吗?我已使用两个简单变量成功地解决了这个问题。作为一个初学者,我还不能让代码正常运行,但我会要求稍后进行一些更正。不管怎样,如果有人好奇,我会在下面发布代码:ossz=0 maxi=0 mini=100000000 for I in find-名称'*.$1'| awk-F/'{print$NF}'do echo$i:wc-l您可以一次性获得文件的字数和行数。用户可能不会感谢您在一堆数千GB的文件上运行了两次wc。此外,bash可以在没有bc的情况下自己进行整数加法,例如total=total+行。另外,您通常应该对文件名进行双引号引用,例如您使用wc-l<$f的地方。谢谢您的帮助。我让脚本运行,现在尝试执行一些与服务器相关的脚本。每一个提示的道具,他们是感激的!谢谢@MarkSetchell,所有的分数都非常有效。我也不太确定以上是实际需求,因此没有花太多时间来完善解决方案。喜欢read从“wc”的输出中吞掉文件名字符串的技巧。感谢您的回答,我相信这是理解shell脚本的另一个层次,因为我正在努力让一些脚本运行:D