월별로 ‘du’를 그룹화 할 수 있습니까? –apparent-size /path/to/myfolder331G를 제공합니다.

사진이 많은 디렉토리가 있습니다. 구체적으로, du -sh --apparent-size /path/to/myfolder331G를 제공합니다. 어느 것이 좋습니다. 그러나 이제는 다음과 같이 월별로 그룹화 된 목록을 얻고 싶습니다.

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

리눅스 내장으로 이것을 할 수있는 합리적인 방법이 있습니까? 아니면 직접 파이썬 유틸리티를 작성해야합니까?



답변

리눅스에서는 다음을 시도하십시오.

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 (Mibibytes) 단위로 원하는 경우 다음과 같이 단위를 변환 할 수 있습니다.

$ 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


답변