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

时间:2018-04-07 09:45:44

标签: bash shell wc

我遇到了一个我试图解决的问题,但是从一开始就不考虑整个事情的方法。我的脚本获取扩展并递归搜索每个.extension文件,然后输出“filename: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

2 个答案:

答案 0 :(得分:1)

我认为你几乎就在那里,除非我遗漏了你的要求:

#!/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"

干杯

答案 1 :(得分:0)

这是一行单行打印每个文件找到的行,文件的路径,最后是所有文件中找到的所有行的总和:

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}'

希望这可以让您了解如何根据输入对数据进行格式化,求和等。