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

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

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

有帮助吗?

解决方案

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

wc `find -name '*.m'`

其他提示

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

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

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

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

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

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

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

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

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

其中'$ ='是一个“特殊变量”。保持行数

修改

你也可以试试 sloccount

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

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

我更喜欢这样的东西:

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

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

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

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

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

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

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}' 
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top