forループを使用して他のサブフォルダ内のすべてのファイル数を数える方法

forループを使用して他のサブフォルダ内のすべてのファイル数を数える方法

wc -lファイルがサブフォルダにあるかどうかを知りたいです。ファイルが1つしかない場合は、次のコードを使用できます。

find ./calss{1..20}/ -name 'C1.student' | xargs wc -l

実際、私はC1.studentからC50.studentまでのファイルを含む20のフォルダを持っています。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各クラスの各学生の行数(または複数のファイルがある場合は1行)を取得したい場合。

.student以下を使用して提案されているように、ファイルがいくつかのサブディレクトリの深い場所にある可能性がある場合find

wc -l class<1-20>/**/C<1-50>.student(n)

.student隠しディレクトリのファイルは考慮されませんので、D必要に応じて修飾子を追加してください。)

{1..5}(zshシェルで最初に導入され、他のいくつかの演算子によってコピーされた演算子)は、無条件に拡張されますが、、、、、および1 2 3 4 5などを<1-5>含む1から5までの数字を表す一連の10進数に一致するワイルドカード演算子です。 。他のシェルによってコピーされませんでした。12345010005

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

関連情報