如何计算所有文件行

时间:2017-01-21 14:44:52

标签: linux macos

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

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

2 个答案:

答案 0 :(得分: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确保计算仅在当前目录中完成,而不是在其子目录中完成。所以每个文件都被计算一次。

答案 1 :(得分: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) }'