월별로 'du'를 그룹화 할 수 있습니까?


14

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

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

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


1
리눅스에는 내장 기능 이 없으며 운영 체제 커널입니다. 대신 일부 Linux 기반 운영 체제 (Debian, Fedora, ChromeOS ...)에서 기본적으로 발견되는 명령 을 의미 합니까?
Stéphane Chazelas

8
리눅스 커널은 리눅스 커널이며, 리눅스 커널 내장을 의미한다면 나는 그렇게 말할 것입니다. pedantic 해야 한다면 , 상위 5 개 Linux 배포판의 기본 설치로 통계적으로 설치했을 가능성이있는 일반적인 도구 세트를 의미합니다.
Wayne Werner

1
@WayneWerner 즉, Bash, Coreutils 및 GNU 운영 환경의 기타 핵심 구성 요소를 포함하여 GNU / Linux를 의미합니다. #rmswasright
Damian Yerrick

답변:


23

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

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

이건 끝내줘. awk 튜토리얼을 추천 할 수 있습니까? 약 20 초 안에 눈을 교차시키지 않는 것을 아직 찾지 못했습니다.
hBy2Py

1
@ hBy2Py awk에 대한 내가 가장 좋아하는 소개는 비록 조금 오래 되었지만 Grymoire tutorial 입니다.
John1024

전 사용 제안 printf "%s %9d\n", date, b[date]대신 print date, b[date]번째 열 공간 패딩을 추가
rav_kr

@rav_kr 좋은 생각입니다. 방금 예제를 사용하여 답변을 업데이트했습니다 printf.
John1024

FWIW 당신이 find그 지원 을 가지고 있다면 아마도 그 지원 -maxdepth을 가지고 있을[g]awk입니다PROC_INFO["sorted_in"]="@ind_str_asc"
dave_thompson_085
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.