使用find,wc和sed来计算行数

时间:2009-09-11 17:24:26

标签: bash sed find wc

我试图使用sed来计算基于特定扩展名的所有行。

find -name '*.m' -exec wc -l {} \; | sed ...

我试图执行以下操作,如何在此特定行中包含sed以获取总数。

8 个答案:

答案 0 :(得分:44)

你也可以从wc获得漂亮的格式:

wc `find -name '*.m'`

答案 1 :(得分:13)

这里的大多数答案对大量文件都不适用。如果文件名列表对于单个命令行调用来说太长,则某些文件名会中断,而其他文件名效率低,因为-exec为每个文件启动一个新进程。我相信一个强大而有效的解决方案是:

find . -type f -name "*.m" -print0 | xargs -0 cat | wc -l

以这种方式使用cat很好,因为它的输出直接传送到wc,因此只有少量文件的内容一次保存在内存中。如果单个cat调用的文件太多,cat将被多次调用,但所有输出仍会通过管道传输到单个wc进程。

答案 2 :(得分:6)

您可以通过单个cat实例wc所有文件获取总行数:

find . -name '*.m' -exec cat {} \; | wc -l

答案 3 :(得分:5)

在现代GNU平台上,wc并从参数中找到-print0和-files0-这些参数可以组合成一个命令,用于计算文件中行总数的行。例如:

find . -name '*.c' -type f -print0 | wc -l --files0-from=-

答案 4 :(得分:4)

你也可以使用sed代替wc来计算行数:

 find . -name '*.m' -exec sed -n '$=' {} \;

其中'$='是一个“特殊变量”,用于保存行数

修改

您还可以尝试sloccount

之类的内容

答案 5 :(得分:2)

如果你有很多文件,特别是大文件,那么使用 cat 的解决方案可能会有问题。

第二个解决方案不会像我测试的那样为每个文件提供总数,而不是每行。

我更喜欢这样的东西:

find . -name '*.m' | xargs wc -l | tail -1

无论您拥有多少文件和多大文件,这都可以快速完成工作。

答案 6 :(得分:1)

sed不适合计算。请改用awk:

find . -name '*.m' -exec awk '{print NR}' {} +

使用+代替\; force发现每找到N个文件都会调用awk(比如xargs)。

答案 7 :(得分:1)

对于大目录,我们应该使用:

find . -type f -name '*.m' -exec sed -n '$=' '{}' + 2>/dev/null | awk '{ total+=$1 }END{print total}' 

# alternative using awk twice
find . -type f -name '*.m' -exec awk 'END {print NR}' '{}' + 2>/dev/null | awk '{ total+=$1 }END{print total}'