for 루프를 사용하여 다른 하위 폴더의 모든 파일 수를 계산하는 방법

for 루프를 사용하여 다른 하위 폴더의 모든 파일 수를 계산하는 방법

wc -l 파일이 하위 폴더에 있는지 알고 싶습니다. 파일이 하나만 있는 경우 아래와 같은 코드를 사용할 수 있습니다.

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각 수업의 각 학생에 대한 행 수( 또는 파일이 여러 개인 경우 한 행) 를 얻으려는 경우 .

.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까지의 숫자를 나타내는 일련의 십진수와 일치하는 와일드카드 연산자입니다. 다른 쉘에 의해 복사되지 않았습니다.12345010005

glob n한정자는 일치하는 파일 목록을 숫자로 정렬하는 데 사용됩니다.

학생당 모든 강좌에 대해 원하는 파일 줄 수인 경우 다음을 수행합니다.

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

관련 정보