확장자별로 그룹화된 전체 파일 크기를 찾는 방법

확장자별로 그룹화된 전체 파일 크기를 찾는 방법

저는 다른 동료들과 공유하는 클러스터에서 작업하고 있습니다. 하드 드라이브 공간은 제한되어 있으므로(가끔 꽉 차는 경우도 있음) 가끔 섹션을 정리합니다. 이 작업을 빨리 수행하고 싶기 때문에 지금까지는 3개월이 넘고 크기가 100MB가 넘는 파일 목록을 만든 다음 해당 파일이 여전히 필요한지 확인하는 방식으로 이 작업을 수행했습니다.

하지만 이제는 누락된 1000개 이상의 작은 파일이 포함된 폴더가 있을 수 있다고 생각하므로 이것이 사실인지 확인할 수 있는 쉬운 방법을 찾고 싶습니다. 데이터를 생성하는 방식에서 이는 각 확장 프로그램의 전체 크기 목록을 얻는 데 도움이 될 것입니다. 이 질문의 맥락에서 "확장자"는 파일 이름의 마지막 점 뒤의 모든 것입니다.

여러 파일이 포함된 여러 폴더가 있다고 가정해 보겠습니다.

folder1/file1.bmp   40 kiB
folder1/file2.jpg   20 kiB
folder2/file3.bmp   30 kiB
folder2/file4.jpg    8 kiB

다음과 같이 각 파일 확장자의 전체 파일 크기를 나열할 수 있습니까?

bmp 70 kiB
jpg 28 kiB

확장자가 없는 파일은 신경 쓰지 않으므로 무시하거나 클래스에 넣을 수 있습니다.

ls, , du및 의 매뉴얼 페이지를 살펴봤지만 find해당 작업에 적합한 도구가 무엇인지 모르겠습니다...

답변1

GNU 시스템에서:

LC_ALL=C find . -name '?*.*' -type f -printf '%b.%f\0' |
  LC_ALL=C gawk -F . -v RS='\0' '
    {s[$NF] += $1; n[$NF]++}
    END {
      PROCINFO["sorted_in"] = "@val_num_asc"
      for (e in s) printf "%15d %4d %s\n", s[e]*512, n[e], e
    }'

또는 GNU 확장을 perl피하는 것과 동일합니다 (여전히 GNU 확장을 사용 하지만 이제 이 확장은 더 광범위하게 지원됩니다).-printffind-print0

LC_ALL=C find . -name '?*.*' -type f -print0 |
  perl -0ne '
    if (@s = lstat$_){
      ($ext = $_) =~ s/.*\.//s;
      $s{$ext} += $s[12];
      $n{$ext}++;
    }
    END {
      for (sort{$s{$a} <=> $s{$b}} keys %s) {
        printf "%15d %4d %s\n",  $s{$_}<<9, $n{$_}, $_;
      }
    }'

다음과 같은 출력이 제공됩니다.

          12288    1 pnm
          16384    4 gif
         204800    2 ico
        1040384   17 jpg
        2752512   83 png

원하는 경우 KiB... MiB접미사를 numfmt --to=iec-i --suffix=B.

%b*512디스크 사용량이 나와 있지만 파일이 여러 번 하드 링크된 경우 여러 번 계산되므로 보고된 내용과 차이가 있을 수 있습니다 du.


1 예외적으로 HP/UX에서 lstat()/로 보고된 블록 크기는 stat()512가 아닌 1024입니다. GNU는 find이를 조정하여 %b여전히 512바이트 단위의 수를 나타내지만 의 경우 perl1024를 곱해야 합니다.

답변2

또 다른 해결책은 다음과 같습니다.

find . -type f |  egrep -o "\.[a-zA-Z0-9]+$" | sort -u | LC_ALL=C xargs -I '%' find . -type f -name "*%" -exec du -ch {} + -exec echo % \; | egrep "^\.[a-zA-Z0-9]+$|total$" | uniq | paste - -

확장되는 부분은 다음과 같습니다.

find . -type f |  egrep -o "\.[a-zA-Z0-9]+$" | sort -u

다음으로 확장자가 있는 파일을 검색하여 화면에 인쇄합니다.

LC_ALL=C xargs -I '%' find . -type f -name "*%" -exec du -ch {} + -exec echo % \;

다음으로 내선 번호와 총 번호를 유지하려고 합니다.

egrep "^\.[a-zA-Z0-9]+$|total$" | uniq

같은 줄에 유지하십시오.

paste - -

답변3

Stephen의 솔루션만큼 좋지는 않지만 시도해 볼 수 있습니다.

find . -type f -name "*.png" -print0 | xargs -0r du -ch | tail -n1

각 파일 유형에 대해 이 명령을 실행해야 합니다.

답변4

아직 코멘트를 작성할 만큼 평판 포인트가 충분하지 않기 때문에 여기에서 Stéphane Chazelas의 답변을 확장하겠습니다. 확장자가 없는 파일(예: 실행 파일)을 목록에 포함하려면 다음 명령줄을 사용할 수 있습니다.

find . -name '*' -type f -printf '%b.%f\0' | awk -F . -v RS='\0' '{if (NF==2) $(NF+1)=" "; s[$NF] += $1; n[$NF]++} END {for (e in s) printf "%15d %6d  %s\n", s[e]*512, n[e], e}' | sort -rn | numfmt --to=iec-i --suffix=B

관련 정보