"du"를 월별로 그룹화할 수 있나요?

"du"를 월별로 그룹화할 수 있나요?

사진이 많이 담긴 카탈로그가 있어요. 구체적으로는 du -sh --apparent-size /path/to/myfolder331G를 받았습니다. 정말 대단해요. 하지만 이제 목록을 월별로 그룹화하고 싶습니다. 예를 들면 다음과 같습니다.

2016-01   20MB
2016-02  520MB
2016-03  312MB
...

Linux 내장 기능을 사용하여 이를 수행할 수 있는 (합리적인) 방법이 있습니까, 아니면 이를 수행하기 위해 Python 유틸리티를 직접 작성해야 합니까?

답변1

Linux에서는 다음을 시도해 보세요.

find /my/path -maxdepth 1 -type f -printf '%TY-%Tm %s\n' | awk '{b[$1]+=$2} END{for (date in b) print date, b[date]}' | sort

어떻게 작동하나요?

  • find /my/path

    /my/path에서 파일을 찾습니다.

  • -maxdepth 1

    이는 find하위 디렉토리를 조사하지 말 것을 의미합니다. (재귀적으로 검색하려면 이 옵션을 무시하세요.)

  • -type f

    이는 find검색을 일반 파일로 제한함을 나타냅니다.

  • -printf '%TY-%Tm %s\n'

    이는 find연도와 월을 인쇄한 다음 각 파일의 크기를 바이트 단위로 인쇄하도록 지시합니다.

    사용하지 않기 때문에 발견된 파일의 이름은 인쇄되지 않습니다.

  • b[$1]+=$2

    발견된 각 파일에 대해 2열에 있는 바이트 수를 연관 배열의 해당 연도-월 조합에 대한 수에 추가합니다 b.

  • END{for (date in b) print date, b[date]}

    모든 출력을 처리한 후 find결과를 인쇄합니다.

  • sort

    그러면 날짜순으로 결과가 정렬됩니다.

여러 줄 버전

코드를 여러 줄에 걸쳐 분산시키려는 경우:

find /my/path -maxdepth 1 -type f -printf '%TY-%Tm %s\n' |
  awk '
    {
      b[$1]+=$2
    }

    END{
      for (date in b)
        print date, b[date]
    }
    ' | sort

다음 파일이 포함된 디렉터리를 고려해 보겠습니다.

$ ls -l
total 27816
-rw------- 1 john1024 john1024 2459173 Nov 23  2015 img100.jpg
-rw------- 1 john1024 john1024 3479750 Nov 23  2015 img101.jpg
-rw------- 1 john1024 john1024 4028939 Nov 23  2015 img102.jpg
-rw------- 1 john1024 john1024 2928519 Jul 30 18:55 img103.jpg
-rw------- 1 john1024 john1024 2948294 Jul 30 18:55 img104.jpg
-rw------- 1 john1024 john1024 3177583 Aug  1 16:56 img105.jpg
-rw-rw---- 1 john1024 john1024 3111737 Apr 18  2016 img106.jpg
-rw-rw---- 1 john1024 john1024 1441310 Apr 18  2016 img107.jpg
-rw-rw---- 1 john1024 john1024 2430158 Apr 25 16:26 img108.jpg
-rw-rw---- 1 john1024 john1024 2424504 Apr 25 16:26 img109.jpg

명령의 출력은 다음과 같습니다.

$ find . -maxdepth 1 -type f -printf '%TY-%Tm %s\n' | awk '{b[$1]+=$2} END{for (date in b) print date, b[date]}' | sort
2015-11 9967862
2016-04 9407709
2016-07 5876813
2016-08 3177583

개선하다

바이트 대신 메가바이트(MiB) 단위로 출력하려면 다음과 같이 단위를 변환하면 됩니다.

$ find . -maxdepth 1 -type f -printf '%TY-%Tm %s\n' | awk '{b[$1]+=$2} END{for (date in b) print date, b[date]/1024**2, "MiB"}' | sort
2015-11 9.50609 MiB
2016-04 8.97189 MiB
2016-07 5.60457 MiB
2016-08 3.03038 MiB

를 사용하면 출력 형식을 더 잘 제어할 수 있습니다 printf. 여기서는 소수점 이하 자릿수 하나만 유지하기 위해 다음 형식을 사용하여 크기 형식을 지정합니다 %5.1f.

$ find . -maxdepth 1 -type f -printf '%TY-%Tm %s\n' | awk '{b[$1]+=$2} END{for (date in b) printf "%s %5.1f MiB\n", date, b[date]/1024**2}' | sort
2015-11   9.5 MiB
2016-04   9.0 MiB
2016-07   5.6 MiB
2016-08   3.0 MiB

관련 정보