关于linux:如何计算所有文件行

How to count all the lines of files

我还需要输出目录名。我所能做的就是输出所有目录中目录名为的行的总数。

1
find . -name '*.c' | xargs wc -l | xargs -I{} dirname {} | xargs -I{} dirname {}


我把bash命令的混合,主要是GNU特定命令,确保你有它们,GNU grepGNU Awk

1
2
3
find . -type f -print0 | xargs -0 grep -c ';$' | \
  awk -F":" '$NF>0{cmd="dirname"$1; while ( ( cmd | getline result ) > 0 ) {printf"%s\t%s
",result,$2} close(cmd) }'

想法是grep -c返回格式为file-name:count的模式计数,我将它传递给GNU Awk以过滤那些计数大于零的文件,并打印包含它的文件的目录和计数本身。

就像他们现在所说的一条漂亮的邮轮,

1
2
find . -type f -print0 | xargs -0 grep -c ';$' | awk -F":" '$NF>0{cmd="dirname"$1; while ( ( cmd | getline result ) > 0 ) {printf"%s\t%s
",result,$2} close(cmd) }'


下面是一个脚本:

1
2
3
4
5
6
7
#!/usr/bin/env bash

for dir in */; do (
    cd"$dir"
    count=$(find . -name '*.c' -print0 | xargs -0 grep '[;]$' | wc -l)
    echo -e"${count}\t${dir}"
) done

如果需要每个子目录的编号:

1
2
3
4
5
6
7
8
#!/usr/bin/env bash

for dir in $(find . -type d); do (
    cd"$dir"
    count=$(find . -maxdepth 1 -name '*.c' -print0 | \
        xargs -0 grep '[;]$' | wc -l)
    echo -e"${count}\t${dir}"
) done

使用-maxdepth 1确保计算只在当前目录中进行,而不是在其子目录中进行。所以每个文件都要计数一次。