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]})

おすすめ記事