Tôi có thể nhận được một `du` được nhóm theo tháng không?


14

Tôi có một thư mục với rất nhiều hình ảnh trong đó. Cụ thể, du -sh --apparent-size /path/to/myfoldercho tôi 331G. Đó là tuyệt vời. Nhưng bây giờ tôi muốn có được một danh sách được nhóm theo tháng, ví dụ như một cái gì đó như thế này:

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

Có cách nào (hợp lý) để làm điều này với các nội dung linux hay tôi chỉ nên viết tiện ích Python của riêng mình để làm điều đó?


1
Linux không có nội dung , đó là nhân hệ điều hành. Bạn có nghĩa là với các lệnh được tìm thấy theo mặc định trong một số hệ điều hành dựa trên Linux (như Debian, Fedora, ChromeOS ...) thay vào đó?
Stéphane Chazelas

8
Hạt nhân Linux là hạt nhân linux và nếu tôi muốn nói là hạt nhân linux tôi sẽ nói điều đó. Nếu bạn phải là người phạm tội, ý tôi là bộ công cụ chung mà bạn có khả năng đã được cài đặt với cài đặt mặc định của bất kỳ 5 bản phân phối linux hàng đầu nào.
Wayne Werner

1
@WayneWerner Nói cách khác, bạn có nghĩa là GNU / Linux, bao gồm Bash, Coreutils và các thành phần cốt lõi khác của môi trường vận hành GNU. #rmswasright
Damian Yerrick

Câu trả lời:


23

Trên linux, hãy thử:

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

Làm thế nào nó hoạt động

  • find /my/path

    Điều này tìm kiếm các tập tin trong / my / path.

  • -maxdepth 1

    Điều này nói findkhông nhìn vào thư mục con. (Nếu bạn muốn tìm kiếm đệ quy, hãy bỏ tùy chọn này.)

  • -type f

    Điều này nói findđể giới hạn tìm kiếm vào các tập tin thông thường.

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

    Điều này nói find để in ra năm tháng theo sau là kích thước tính theo byte cho mỗi tệp.

    Vì chúng tôi không sử dụng chúng, tên của các tệp được tìm thấy không được in.

  • b[$1]+=$2

    Đối với mỗi tệp được tìm thấy, chúng tôi thêm số byte của nó, được tìm thấy từ cột 2, vào số đếm kết hợp năm tháng đó trong mảng kết hợp b.

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

    Sau khi chúng tôi đã xử lý tất cả đầu ra từ find, chúng tôi sẽ in ra kết quả.

  • sort

    Điều này sắp xếp các kết quả theo thứ tự ngày.

Phiên bản nhiều dòng

Đối với những người thích mã của họ trải rộng trên nhiều dòng:

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

Thí dụ

Hãy xem xét một thư mục với các tệp này:

$ 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

Đầu ra từ lệnh của chúng tôi là:

$ 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

Sàng lọc

Nếu chúng ta muốn đầu ra tính bằng mebibytes (MiB) thay vì byte, chúng ta có thể chuyển đổi các đơn vị như thế này:

$ 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

Chúng tôi vẫn có thể kiểm soát nhiều hơn định dạng đầu ra bằng cách sử dụng printf. Ở đây, để chỉ giữ một chữ số sau dấu thập phân, chúng tôi định dạng kích thước bằng %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

Cái này thật tuyệt. Bạn có thể giới thiệu bất kỳ hướng dẫn awk? Tôi chưa tìm thấy cái nào khiến mắt tôi lác lại trong khoảng hai mươi giây.
hBy2Py

1
@ hBy2Py Giới thiệu yêu thích của tôi về awk, mặc dù bây giờ nó hơi cũ, là hướng dẫn của Grymoire .
John1024

tôi đề nghị sử dụng printf "%s %9d\n", date, b[date]thay vì print date, b[date]thêm phần đệm không gian vào cột thứ hai
rav_kr

@rav_kr Ý kiến ​​hay. Tôi chỉ cập nhật câu trả lời với một ví dụ sử dụng printf.
John1024

FWIW nếu bạn có findsự hỗ trợ mà -maxdepthbạn có thể[g]awkmà hỗ trợPROC_INFO["sorted_in"]="@ind_str_asc"
dave_thompson_085
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.