对目录中的文件使用 wc 后进行排序

Sorting after using wc on files from a directory

指定一个命令/一组命令显示当前目录下.c.h文件的代码行数,按字母顺序显示每个文件后跟: 和文件中的行数,最后是代码行总数。 . 可能显示的示例是:

main.c: 202
util.c: 124
util.h: 43
TOTAL: 369

经过多次尝试,我的一行命令的最终结果是:

wc -l *.c *.h | awk '{print  ": " }' | sed "$ s/total/TOTAL/g"

问题是我不知道如何在不移动 TOTAL 的情况下 sort them alphabetically 以及 (considering we don't know how many files are in that folder)。我不确定上面的命令是否有效,所以如果你有更好的命令,你可以包含它的更多变体。

您可以将输入保存到变量中,提取最后一行,对除最后一行以外的所有内容进行排序,然后输出最后一行:

printf '%s\n' 'main.c: 202' 'util.c: 124' 'util.h: 43' 'TOTAL: 369' | {
    v=$(cat);
    total=$(tail -n1 <<<"$v");
    head -n-1 <<<"$v" | sort -r;
    printf "%s\n" "$total";
}

也许更容易将输入参数排序为 wc——也许是这样的:

$ find . -maxdepth 1 '(' -name '*.py' -o -name '*.md' ')' | sort | xargs -d'\n' wc -l | awk '{print ": "}' | sed 's/^total:/TOTAL:/'
./__main__.py: 70
./README.md: 96
./SCREENS.md: 76
./setup.py: 2
./t.py: 10
TOTAL: 254

请注意,我使用 xargs -d'\n' 来避免文件名中包含空格(如果我的目标是 GNU+,我会从 find . 中删除 . 并可能使用 -print0 | sort -z | xargs -0相反)

这是一个使用 python3.8+ 的模因答案(嘿 awk 图灵完整为什么不使用 python?)

python3.8 -c 'import sys;s=0;[print(x+":",-s+(s:=s+len(list(open(x)))))for x in sorted(sys.argv[1:])];print("TOTAL:",s)' *.py *.cfg
__main__.py: 70
setup.cfg: 55
setup.py: 2
t.py: 10
TOTAL: 137

扩展它,它滥用了一些东西:

  • len(list(open(x))) - open(x) returns 一个文件,list 耗尽迭代器(按行)然后它的长度就是行数
  • -s+(s:=s+...) -- 这是一个赋值表达式,它具有累加 s 的副作用,但表达式是差值 (...)
  • sorted(sys.argv)满足排序部分