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