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 find
khô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