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進数に一致するワイルドカード演算子です。 。他のシェルによってコピーされませんでした。1
2
3
4
5
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