28

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

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

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

4

8 回答 8

55

您还可以通过以下方式从 wc 获得漂亮的格式:

wc `find -name '*.m'`
于 2009-09-11T17:37:47.793 回答
18

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

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

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

于 2012-01-07T07:17:55.223 回答
6

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

find . -name '*.m' -exec cat {} \; | wc -l
于 2009-09-11T17:32:35.437 回答
5

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

find . -name '*.c' -type f -print0 | wc -l --files0-from=-
于 2011-06-05T07:38:05.887 回答
4

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

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

'$='保持行数的“特殊变量”在哪里

编辑

你也可以试试sloccount

于 2009-09-11T17:28:55.553 回答
3

Hm, solution with cat may be problematic if you have many files, especially big ones.

Second solution doesn't give total, just lines per file, as I tested.

I'll prefer something like this:

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

This will do the job fast, no matter how many and how big files you have.

于 2009-09-11T17:48:10.453 回答
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}' 
于 2009-09-14T19:01:52.663 回答
1

sed 不是正确的计数工具。改用 awk:

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

使用 + 代替 \; 强制 find 每找到 N 个文件就调用 awk(就像 xargs 一样)。

于 2009-09-12T14:57:07.900 回答