ฉันสามารถจัดกลุ่มตามหมวดหมู่ได้หรือไม่?


14

ฉันมีไดเรกทอรีพร้อมรูปภาพจำนวนมากในนั้น โดยเฉพาะdu -sh --apparent-size /path/to/myfolder331G ให้ฉัน อันไหนดี แต่ตอนนี้ฉันต้องการได้รายชื่อที่จัดกลุ่มตามเดือนเช่นบางสิ่งเช่นนี้:

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

มีวิธี (สมเหตุสมผล) ในการทำเช่นนี้กับ linux builtins หรือฉันควรเขียนยูทิลิตี้ Python ของตัวเองเพื่อทำมัน?


1
Linux ไม่มีbuiltinsแต่เป็นเคอร์เนลระบบปฏิบัติการ คุณหมายถึงคำสั่งที่พบตามค่าเริ่มต้นในระบบปฏิบัติการ Linux บางระบบ (เช่น Debian, Fedora, ChromeOS ... )แทนหรือไม่?
Stéphane Chazelas

8
เคอร์เนลลินุกซ์คือเคอร์เนลลินุกซ์และถ้าฉันหมายถึงเคอร์เนลลินุกซ์ในตัวฉันจะบอกว่า หากคุณต้องอวดความหมายฉันหมายถึงชุดเครื่องมือทั่วไปที่คุณมีแนวโน้มว่าจะติดตั้งด้วยการติดตั้งเริ่มต้นของลินุกซ์ distros ใด ๆ 5 อันดับแรก
Wayne Werner

1
@WayneWerner กล่าวอีกนัยหนึ่งคุณหมายถึง GNU / Linux รวมถึง Bash, Coreutils และส่วนประกอบหลักอื่น ๆ ของสภาพแวดล้อมการทำงานของ GNU #rmswasright
Damian Yerrick

คำตอบ:


23

บน 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

มันยอดเยี่ยมมาก คุณช่วยแนะนำบทเรียน awk ได้ไหม? ฉันยังไม่ได้พบคนที่ไม่ได้ทำให้ตาของฉันข้ามภายในประมาณยี่สิบวินาที
hBy2Py

1
@ แนะนำที่ชื่นชอบของฉันเพื่อ hBy2Py awk แม้ว่าตอนนี้มันเป็นบิตลงวันที่เป็นGrymoire กวดวิชา
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.