我试图使用sed来计算基于特定扩展名的所有行。
find -name '*.m' -exec wc -l {} \; | sed ...
我试图执行以下操作,如何在此特定行中包含sed以获取总数。
答案 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}'