【问题标题】:Searching for .extension files recursively and print the number of lines in the files found?递归搜索 .extension 文件并打印找到的文件中的行数?
【发布时间】:2018-04-07 09:45:44
【问题描述】:

我遇到了一个我试图解决的问题,但如果不从一开始就做完整个事情,我就想不出办法。我的脚本获取扩展名并递归搜索每个 .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

【问题讨论】:

  • 单引号内的字符串不会被插值。您确定要搜索扩展名为 .$1 的文件吗?
  • 我已经使用两个简单的变量成功地解决了这个问题。作为一个初学者,我还不能让代码正常运行,但稍后我会要求进行一些更正。无论如何,如果有人好奇,我会在下面发布代码:
  • ossz=0 maxi=0 mini=100000000 for i in find . -name '*.$1'|awk -F/ '{print $NF}' do echo "$i:wc -l &lt;$i|bc:wc -w &lt;$i|bc">>temp.txt if ((wc -w &lt;$i > maxi )) maxi=wc -w &lt;$i if ((wc -w&lt;$i wc -w <$i ossz=ossz+wc -l &lt;$i sort -r -t : -k3 temp.txt cat temp.txt echo "$maxi:$mini " 回声 $ossz

标签: bash shell wc


【解决方案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"

编辑
根据 cmets 中 @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"

干杯

【讨论】:

  • 您可以一次性获取文件的字数和行数。用户可能不会感谢您在一堆数 GB 的文件上运行两次 wc。此外,bash 可以在没有bc 的情况下自行添加整数,例如((total=total+lines))。此外,您通常应该用双引号括起文件名,例如使用 wc -l &lt; $f 的位置。
  • 感谢您的所有帮助。我让脚本运行,现在尝试做一些与服务器相关的脚本。每个提示的道具,他们不胜感激!
  • 感谢@MarkSetchell,所有这些都非常有效。我不太确定以上是否是实际要求,因此没有花太多时间来“改进”解决方案。喜欢阅读提示以“吞下”“wc”输出中的文件名字符串。
【解决方案2】:

这是单行打印每个文件找到的行、文件的路径以及最后在所有文件中找到的所有行的总和:

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

在此示例中,如果将查找所有以 *.go 结尾的文件,则将执行使用 wc -l 获取行数并将输出打印到标准输出,awk 然后用于对第 1 列的所有输出求和在变量s 中,只会在最后打印一个:END {print s}

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

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

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

【讨论】:

  • 感谢您的精彩回答,我相信这是理解 shell 脚本的另一个层次,因为我正在努力让一些脚本运行 atm。 :D
猜你喜欢
  • 2013-03-21
  • 1970-01-01
  • 1970-01-01
  • 2014-07-08
  • 2019-10-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-14
相关资源
最近更新 更多