对目录中的文件使用 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)
满足排序部分
指定一个命令/一组命令显示当前目录下.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)
满足排序部分