วิธีรับขนาดที่สรุปของไดเรกทอรีและไดเรกทอรีย่อย?


307

สมมติว่าฉันต้องการได้ขนาดของแต่ละไดเรกทอรีของระบบไฟล์ Linux เมื่อฉันใช้ls -laฉันไม่ได้ขนาดที่สรุปจริง ๆ ของโฟลเดอร์

ถ้าฉันใช้dfฉันจะได้ขนาดของระบบไฟล์ที่เมานต์ แต่ก็ไม่ได้ช่วยฉัน และเมื่อduฉันได้ขนาดของแต่ละไดเรกทอรีย่อยและสรุปของระบบไฟล์ทั้งหมด

แต่ฉันต้องการมีขนาดที่สรุปโดยรวมของแต่ละไดเรกทอรีภายในโฟลเดอร์ ROOT ของระบบไฟล์ มีคำสั่งให้ทำเช่นนั้นหรือไม่?


--totalธงเป็นประโยชน์สำหรับฉัน du -sh --total applications/*เช่น askubuntu.com/a/465436/48214
Ryan

คำตอบ:


433

นี่คือสิ่งที่คุณกำลังมองหา:

du -sh /*

หมายความว่าอะไร:

  • -s เพื่อให้ผลรวมสำหรับอาร์กิวเมนต์บรรทัดคำสั่งแต่ละรายการเท่านั้น
  • -hสำหรับคำต่อท้ายที่มนุษย์สามารถอ่านได้เช่นMสำหรับเมกะไบต์และGกิกะไบต์ (ตัวเลือก)
  • /*ก็ขยายไปยังไดเรกทอรีทั้งหมด (และไฟล์) /ใน

    หมายเหตุ: ไม่รวม dotfiles วิ่งshopt -s dotglobไปรวมเหล่านั้นด้วย

ยังมีประโยชน์คือการเรียงลำดับตามขนาด:

du -sh /* | sort -h

ที่นี่:

  • -hตรวจสอบให้แน่ใจว่าsortตีความคำต่อท้ายที่มนุษย์อ่านได้อย่างถูกต้อง

8
หากคุณมีจุดไดเรกทอรีในไดเรกทอรีรากคุณสามารถใช้shopt -s dotglobเพื่อรวมไว้ในการนับ
Philipp

8
มันมีประโยชน์มากเพราะมันง่ายและคุณสามารถวางเส้นทางที่คุณต้องการแทน/*เช่น./ไดเรกทอรีปัจจุบันหรือ./*สำหรับแต่ละรายการในไดเรกทอรีปัจจุบัน
psur

3
@psur หรือคุณสามารถใช้./*/เพื่อรับเฉพาะโฟลเดอร์ย่อยเท่านั้นและไม่ใช่ทุกรายการ
relascope

7
รุ่นที่จัดเรียง:du -sh /* | sort -h
Vu Anh

2
@ c1phr หากคุณsortไม่มี-hคุณต้องปล่อยทิ้งไว้duเช่นกันมิฉะนั้นการเรียงลำดับจะรวมกันเป็นกิโลกรัม / เมกะไบต์ / กิกะไบต์ du -s /* | sort -nr.
โทมัส

79

ฉันมักจะต้องค้นหาไดเรกทอรีที่ใหญ่ที่สุดดังนั้นเพื่อให้รายการเรียงลำดับที่มี dirs ที่ใหญ่ที่สุด 20 ฉันทำสิ่งนี้:

du -m /some/path | sort -nr | head -n 20

ในกรณีนี้ขนาดจะถูกรายงานเป็นเมกะไบต์


11
นี่คือวิธีในการทำให้ du -sh / some / path อ่านได้ง่ายขึ้น เรียงลำดับ -hr | หัว -n 20
Xedecimal

6
@ Xedecima ปัญหาเกี่ยวกับการใช้ h คือการเรียงลำดับไม่ทราบวิธีจัดการขนาดที่แตกต่างกัน ตัวอย่างเช่น 268K ถูกจัดเรียงสูงกว่า 255M และทั้งคู่เรียงสูงกว่า 2.7G
chrisan

4
อาร์กิวเมนต์ -h (อ่านโดยมนุษย์) บนคำสั่ง 'sort' ควรอ่านค่าเหล่านี้อย่างเหมาะสม เช่นเดียวกับธง du-h ของการส่งออก ฉันคาดเดาขึ้นอยู่กับสิ่งที่คุณกำลังทำงาน
Xedecimal

ทำงานได้ใน Ubuntu 16.04 เคล็ดลับที่ดี
SDsolar

sudo du -haxt 1G / | เรียงลำดับ -hr | หัว -30
เบี่ยงเบน

22

ฉันชอบที่จะใช้Ncduสำหรับสิ่งนั้นคุณสามารถใช้เคอร์เซอร์เพื่อนำทางและเจาะลึกโครงสร้างไดเรกทอรีที่ใช้งานได้ดี


น่ากลัว คำสำคัญ: du พบ ncurses คุณสามารถใช้bเพื่อวางลงในเชลล์ในไดเรกทอรี
Ciro Santilli 新疆改造中心法轮功六四事件

11

คำตอบที่มีอยู่มีประโยชน์มากบางทีผู้เริ่มต้น (เช่นฉัน) บางคนอาจพบว่าสิ่งนี้มีประโยชน์เช่นกัน

  1. การวนซ้ำขั้นพื้นฐานมาก แต่สำหรับฉันนี่เป็นการเริ่มต้นที่ดีสำหรับการดำเนินการอื่น ๆ ที่เกี่ยวข้อง:

    for each in $(ls) ; do du -hs "$each" ; done
    
  2. คล้ายกับคำตอบแรกและเกือบจะเหมือนกับผลลัพธ์ที่ 1) แต่ฉันใช้เวลาพอสมควรที่จะเข้าใจความแตกต่างของ * กับ. / * ถ้าอยู่ในไดเรกทอรีย่อย:

    du -sh ./*
    

for eachไม่ทำงานเนื่องจากจะผนวกอักขระคอนโซล (เช่น\033[) เข้ากับรายการโฟลเดอร์
machineaddict

@machineaddict ไม่แน่ใจว่าคุณหมายถึงอะไร ฉันใช้มันตลอดเวลาทำงานให้ฉันได้ดี
Martin

for eachพยายามที่จะเรียกใช้คำสั่งของคุณเริ่มต้นด้วย มันจะไม่ทำงาน
machineaddict

ฉันเรียกใช้คำสั่งตรงตามที่เขียนไว้ที่นี่ เริ่มต้นด้วยสำหรับแต่ละ โรงงาน
Martin

7

การduเรียกใช้ต่อไปนี้ควรทำงานบนระบบ BSD:

du -d 1 /

1
ฉันdu(Ubuntu 10.4) ไม่มี-dตัวเลือก คุณใช้ระบบอะไร
โทมัส

ใน openSUSE ของฉันไม่มีตัวเลือก -d เช่น :(
2ndkauboy

ตกลงจากนั้นเป็นตัวเลือก BSD เท่านั้น (ฉันใช้ OS X)
Philipp

ขวารวมกันตัวเลือกแบบพกพาใน BSD / * NIX du -sk /*คือ ฉันเกลียด-kสิ่งที่มากเกินไป ลินุกซ์ ' -hเต็มเปาหิน
Dummy00001

ในระบบอื่นมัน--max-depth
Vishnu Kumar

4

มันไม่ง่ายเลย duคำสั่งอย่างใดอย่างหนึ่งที่แสดงให้เห็นไฟล์และโฟลเดอร์ (เริ่มต้น) หรือเพียงแค่ขนาดของรายการทั้งหมดที่คุณระบุในบรรทัดคำสั่ง (ตัวเลือก-s)

ในการรับไอเท็มที่ใหญ่ที่สุด (ไฟล์และโฟลเดอร์) เรียงลำดับด้วยขนาดที่มนุษย์สามารถอ่านได้บน Linux:

du -h | sort -h

วิธีนี้จะฝังไฟล์ของคุณเป็นไฟล์ขนาดเล็ก คุณสามารถกำจัดพวกเขาด้วย--threshold(1 MB ในตัวอย่างของฉัน):

du --threshold=1M -h | sort -h

ข้อดีของคำสั่งนี้คือมันมีโฟลเดอร์ dot ที่ซ่อนอยู่ (โฟลเดอร์ที่ขึ้นต้นด้วย.)

หากคุณต้องการโฟลเดอร์จริงๆคุณต้องใช้findแต่อาจช้ามากเนื่องจากduต้องสแกนหลาย ๆ โฟลเดอร์หลาย ๆ ครั้ง:

find . -type d -print0 | sort -z | xargs --null -I '{}' du -sh '{}' | sort -h

1
- เกณฑ์ ^^^ ตัวเลือกนี้ไม่มีประโยชน์ใน linux
podarok

1
@podarok มันมีอยู่ใน OpenSUSE 13.2 Linux ลองค้นหาการแจกจ่ายที่เป็นรุ่นล่าสุดของคุณหรือคอมไพล์แพคเกจเวอร์ชั่นที่ใหม่กว่าด้วยตัวคุณเอง
Aaron Digulla

มันไม่ทำงานบน Ubuntu LTS (14.04) เป็นรายการล่าสุด))
podarok

@podarok coreutils รุ่นใดของ GNU ของฉันคือ 8.24
Aaron Digulla

1
การแคชอาจเป็นคำที่ไม่ดี ฉันคิดถึงสิ่งที่ทำในพอร์ตนี้superuser.com/a/597173/121352ที่เราสแกนเนื้อหาดิสก์หนึ่งครั้งในการทำแผนที่แล้วใช้ข้อมูลจากการทำแผนที่นั้นต่อไปแทนที่จะกดดิสก์อีกครั้ง
Hennes

1

โปรดระวังว่าคุณไม่สามารถเปรียบเทียบไดเรกทอรีกับduระบบ / เครื่องที่แตกต่างกันได้โดยไม่ต้องแน่ใจว่าทั้งคู่ใช้ขนาดบล็อกเดียวกันของระบบไฟล์ สิ่งนี้อาจนับหากคุณซิงค์ไฟล์บางไฟล์จากเครื่อง linux กับ nas และคุณต้องการเปรียบเทียบไดเรกทอรีที่ซิงค์ด้วยตัวคุณเอง คุณอาจได้รับผลลัพธ์ที่แตกต่างกันด้วยduเนื่องจากขนาดบล็อกที่แตกต่างกัน ....


0

นอกจากนี้คุณยังอาจต้องการตรวจสอบxdiskusage จะให้ข้อมูลที่เหมือนกัน แต่จะแสดงเป็นกราฟิกและอนุญาตให้เจาะลึก (มีประโยชน์มาก) มียูทิลิตีอื่นที่คล้ายคลึงกันสำหรับ KDE และแม้แต่ Windows


0

คุณสามารถใช้lsร่วมกับawk:

ls -al * | awk 'BEGIN {tot=0;} {tot = tot + $5;} END {printf ("%.2fMb\n",tot/1024/1024);}'

การส่งออกของเป็นประปาเพื่อls เริ่มประมวลผลข้อมูล ตัวคั่นมาตรฐานคือพื้นที่ ตัวแปรผลรวมถูกกำหนดค่าเริ่มต้นเป็นศูนย์ ข้อความต่อไปนี้จะถูกดำเนินการแต่ละแถว / สายออกมาโดย มันเพิ่มขึ้นตามขนาดเท่านั้น ย่อมาจากคอลัมน์ที่ห้า (แสดงผลโดย) ในตอนท้ายเราหารด้วย (1024 * 1024) เพื่อหาผลรวมเป็นเมกะไบต์awkawktotlstot$5ls

หากคุณต้องการแปลงให้เป็นสคริปต์หรือฟังก์ชั่น (.bashrc) คุณยังสามารถใช้มันเพื่อรับขนาดของเซตย่อยของไดเรกทอรีบางส่วนตามประเภทไฟล์

หากคุณต้องการข้อมูลกว้าง ๆ ของระบบkdirstatอาจมีประโยชน์!


ฉันเห็นด้วยอย่างหนึ่งสามารถขยายตัวอย่างนี้และทำเทคนิคเช่นการรับขนาดของ "บางส่วนย่อยของไดเรกทอรีตาม filetypes" ฯลฯ มันอาจเป็นจุดเริ่มต้นที่ดี อย่างไรก็ตามวิธีนี้มีข้อบกพร่องตั้งแต่เริ่มต้น ให้กับผู้ที่ต้องการที่จะใช้วิธีการนี้ผมขอแนะนำให้อ่านคำตอบและความคิดเห็นของทุกคำถามนี้เช่นเดียวกับบทความเชื่อมโยงมี ฉันไม่ได้บอกว่าคุณไม่สามารถทำได้เลย รู้ข้อ จำกัด นั่นคือทั้งหมดที่
Kamil Maciorowski
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.