我还需要将目录名称作为输出。我能做的是用目录名输出所有目录中的总行数。
find . -name '*.c' | xargs wc -l | xargs -I{} dirname {} | xargs -I{} dirname {}
答案 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 grep
和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) }'
我的想法是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) }'