디렉토리에 있는 파일 수를 표시하는 스크립트(파일 유형별)?

디렉토리에 있는 파일 수를 표시하는 스크립트(파일 유형별)?

특정 디렉터리에 대한 이러한 종류의 통계를 표시하고 싶습니다.

$ myscript.sh
.c 34265 files
.h 17866 files
.cbl 1804 files
.pco 389 files
[...]

이 작업을 수행할 수 있는 도구가 있나요?

내 시도는 다음과 같습니다.

find . -name "*.*" | sed -e "s/.*\.//g" | sort -u

그런 다음 각 유형에 대한 입력을 가질 수 있지만 find . -name "*.pc" | wc -l번거롭기 때문에 다음과 같이 작성했습니다.

find . -name "*.*" | sed -e "s/.*\.//g" | sort -u |\
    xargs find . -name "*.{}" | wc -l

불행하게도 나는 다음과 같은 내용 때문에 뭔가를 놓친 것 같습니다:

find: paths must precede expression: as

("as"가 첫 번째 확장자임)
무엇이 잘못되었는지 아시나요?
내가 원하는 작업을 수행하는 도구가 이미 있습니까(파일의 줄 수를 계산하는 도구도 작동함).

답변1

이는 다음을 통해 파일 이름 목록을 파이핑하여 수행할 수 있습니다 gawk(연습/테스트로 사용 하지만 구문 분석 (tm) ls -1하지는 않음 ).ls

gawk -F. '1 {exts[$NF]++} END {for (ext in exts){printf "%s: %s files\n", ext, exts[ext]}}'

이는 마침표 뒤의 모든 내용이 확장자의 일부가 아니라고 가정하므로 마침표가 없는 파일 이름은 전체 확장자로 처리됩니다. (올바른 확장자를 가진 파일을 가져오는 것으로 변경하는 1 {것만으로 (NF>1) {도 충분하다고 생각합니다 .

답변2

다음 파이프라인은 반복 횟수가 앞에 오는 입력의 각 고유 라인을 반복 횟수를 줄여 정렬하여 인쇄합니다.

sort | uniq -c | sort -rn

그러므로:

find . -type f -name '?*.*' | sed 's/.*\.//' | sort | uniq -c | sort -rn

답변3

ls -1 | awk -F. '{if(NF>1)arr[$NF]++;else blnk++}END{for(i in arr)printf(".%s %s file(s)\n",i,arr[i]);printf("<No Extension> %s file(s)\n",blnk)}'

관련 정보