2017-01-21 86 views
2

我还需要目录名称作为输出。我能做的就是输出所有目录中具有目录名称的总行数。如何统计文件的所有行

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

你能有一个适当的例子再次重申您的要求?你能详细解释一下吗? – Inian

+0

@Inian,基本上我想拥有目录路径和该目录中以分号结尾的行数(该目录中所有文件的行数)。我可以用'find'输出在目录中以分号结尾的行的总数。 -name'* .c'-print0 | xargs -0 grep'[;] $'| wc -l',但我不知道如何通过目录获取输出。 – Theseven7

+0

@Inian,做到了。 – Theseven7

回答

0

我已经混乱了bash命令的混合物大多GNU特异性,请确保您有他们,GNU grepGNU Awk

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

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

由于他们称之为这几天看上一个内胆,

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

做这份工作!感谢您的解释。 – Theseven7

0

这里是一个脚本:

#!/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 

如果你想为每个子目录编号:使用

#!/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确保计算仅在当前目录下完成的,而不是其子目录。所以每个文件都被计算一次。

+0

有没有办法修改循环来查看子目录呢? – Theseven7

+0

增加了另一个脚本。 –

相关问题