บน 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
การปรับแต่ง
ถ้าเราต้องการผลลัพธ์เป็น mebibytes (MiB) แทน bytes เราสามารถแปลงหน่วยดังนี้:
$ 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