我想知道 wc -l 文件是否位于子文件夹中。如果只有一个文件,我可以使用如下代码。
find ./calss{1..20}/ -name 'C1.student' | xargs wc -l
事实上,我有 20 个文件夹,每个文件夹都包含 C1.student 到 C50.student 文件。我想用wc
它来计算不同子文件夹中的多个文件。
我尝试了这段代码,但得到的全是 0,我错过了什么吗?谢谢你的时间。
for i in $(seq 1 50); do
find ./calss{1..20}/ -name 'C${i}.student' | xargs wc -l
done
答案1
在 zsh 中(假设默认值为$IFS
,此处使用 IFS 分割来修剪某些实现添加的数字周围的空格wc
):
for class (class<1-20>(Nn)) print $class: $(cat $class/C<1-50>.student | wc -l)
.student
获取报告或每个文件中的总行数班级。或者
wc -l class<1-20>/C<1-50>.student(n)
如果您想获取每个班级中每个学生的行数(total
如果有多个文件,则获取一行)。
如果.student
文件可能位于某些子目录深处,正如您的使用find
建议可能是这样:
wc -l class<1-20>/**/C<1-50>.student(n)
(请注意,.student
不考虑隐藏目录中的文件,D
如果需要,请添加限定符)。
While {1..5}
(首先由 zsh shell 引入并被其他一些人复制的运算符)无条件扩展为1
2
3
4
5
,<1-5>
是一个通配运算符,匹配表示数字 1 到 5 的十进制数字序列,包括1
, 2
, 3
,4
以及,等5
。尚未被其他 shell 复制。01
0005
globn
限定符用于按数字对匹配文件列表进行排序。
如果它是您想要的每个学生的所有课程的文件行数,那么:
typeset -A files=()
for f (class<1-20>/C<1-50>.student(N)) files[$f:r]+=$f$'\0'
for student (${(kn)files}) print $student: $(wc -l ${(0)files[$student]})
答案2
我将其读为文件数,忽略了您的代码使用wc -l
.
尝试sort | uniq -c
一下文件名,
find calss{1..20} -type f -name "C*.Student" -printf "%f\n" | sort | uniq -c
或者不要被换行符阻塞:
find calss{1..20} -type f -name "C*.Student" -printf "%f\0" | sort -z | uniq -zc | xargs -0n1
输出:
20 C10.Student
15 C11.Student
10 C12.Student
3 C13.Student
7 C14.Student
15 C15.Student
48 C16.Student
20 C17.Student
17 C18.Student
30 C19.Student
18 C1.Student
26 C20.Student
29 C2.Student
20 C3.Student
1 C4.Student
43 C5.Student
20 C6.Student
16 C7.Student
50 C8.Student
1 C9.Student