如何使用for循环计算不同子文件夹中的所有文件

如何使用for循环计算不同子文件夹中的所有文件

我想知道 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 复制。010005

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

相关内容