ฉันจะรับขนาดของไดเรกทอรีในบรรทัดคำสั่งได้อย่างไร


1066

ฉันพยายามที่จะได้รับขนาดของไดเรกทอรี (ที่มีไดเรกทอรีและไดเรกทอรีย่อย) โดยใช้คำสั่งที่มีตัวเลือกls lดูเหมือนว่าจะใช้งานได้กับไฟล์ ( ls -l file name) แต่ถ้าฉันพยายามหาขนาดของไดเรกทอรี (เช่นls -l /home) ฉันจะได้รับเพียง 4096 ไบต์แม้ว่าทั้งหมดจะใหญ่กว่าก็ตาม


18
1) พูดอย่างเคร่งครัดคุณไม่สามารถ Linux มีไดเรกทอรีไม่ใช่โฟลเดอร์ 2) มีความแตกต่างระหว่างขนาดของไดเรกทอรี (ซึ่งเป็นไฟล์พิเศษที่ถือไอโหนดที่ชี้ไปที่ไฟล์อื่น) และขนาดของเนื้อหาของไดเรกทอรีนั้น ตามที่คนอื่น ๆ ได้ชี้ให้เห็นคำสั่ง du ให้หลังซึ่งเป็นสิ่งที่คุณต้องการ
jamesqf

11
ตามที่คุณดูเหมือนจะใหม่ฉันจะชี้ให้เห็น-hตัวเลือกที่เป็นประโยชน์ที่คุณสามารถเพิ่มลงใน-lตัวเลือก (เช่นls -lh) เพื่อให้ได้ขนาดของไฟล์ที่จะพิมพ์ออกมาในรูปแบบที่เป็นมิตรกับมนุษย์เช่น 1.1M แทน 1130301 "ในdu -hsคำสั่งที่ @sam ให้ไว้เป็นคำตอบสำหรับคำถามของคุณเกี่ยวกับไดเรกทอรียังหมายถึง" ที่มนุษย์อ่านได้ "และยังปรากฏในdf -hที่แสดงจำนวนการใช้งานและพื้นที่ว่างบนดิสก์ที่มนุษย์สามารถอ่านได้
msouth

คำตอบ:


1490

du -sh file_path

คำอธิบาย

  • duคำสั่ง( d isc u sage) ประมาณการการใช้พื้นที่ว่าง file_path
  • ตัวเลือก-shคือ (จากman du):

      -s, --summarize
             display only a total for each argument
    
      -h, --human-readable
             print sizes in human readable format (e.g., 1K 234M 2G)
    

    หากต้องการตรวจสอบมากกว่าหนึ่งไดเรกทอรีและดูผลรวมให้ใช้du -sch:

      -c, --total
             produce a grand total
    

44
... เว้นแต่คุณจะมี hardlinks ;-) stackoverflow.com/questions/19951883/…
Rmano

15
นี่เป็นคำตอบที่ฉันชอบ <3 สรุปและเป็นการแนะนำให้รู้จักกับคำสั่งduและคุณได้ให้วิธีในการค้นหารายละเอียดเพิ่มเติมman du...

คำแนะนำสำหรับผู้สร้างที่เหมือน Unix: ครั้งต่อไปเพียงแค่ทำคำสั่ง "diskusage" ก่อนหรืออาจจะเป็น "การใช้ดิสก์" ... จากนั้นทางลัด ... ;)
jave.web

มันใช้งานได้ดีมากfind เช่นกับการนับจำนวนของพื้นที่ในไดเรกทอรีย่อยที่เฉพาะเจาะจงในเส้นทางปัจจุบัน: $ find . -type d -name "node_modules" -prune -exec du -sh {} \;
Alex Glukhovtsev

321

เพียงใช้duคำสั่ง:

du -sh -- *

จะให้การใช้งานดิสก์สะสมของไดเรกทอรีที่ไม่ได้ซ่อนไฟล์และอื่น ๆ ทั้งหมดในไดเรกทอรีปัจจุบันในรูปแบบที่มนุษย์อ่านได้

คุณสามารถใช้dfคำสั่งเพื่อทราบพื้นที่ว่างในระบบไฟล์ที่มีไดเรกทอรี:

df -h .

4
du -sh *เริ่มโยนข้อผิดพลาด "ตัวเลือกที่ไม่รู้จัก" หากไฟล์ใด ๆ ใน dir เริ่มต้นด้วยเส้นประ ปลอดภัยยิ่งขึ้นdu -sh -- *
mpen

1
du -sh *ไม่แสดงการใช้งานหน่วยความจำของโฟลเดอร์ที่ถูกซ่อน
Prashant Prabhakar Singh

4
du -sh -- * .*เพื่อรวม dotfiles สิ่งนี้มีประโยชน์ในการรวม.gitไดเรกทอรีที่มีขนาดใหญ่เช่น อีกวิธีหนึ่งใน zsh คุณสามารถsetopt globdotsglob dotfiles โดยค่าเริ่มต้น
cbarrick

1
อะไร--ทำอย่างไร ฉันรู้ว่ามันใช้กับเชลล์บิวด์อินเพื่อสิ้นสุดตัวเลือกอาร์กิวเมนต์ แต่duไม่ใช่บิวด์อินและฉันไม่เห็นการใช้งานนี้บันทึกไว้สำหรับdu: linux.die.net/man/1/du
flow2k

บางครั้งคุณอาจต้องการเพิ่ม-b( --apparent-size)
elig

196

duเป็นเพื่อนของคุณ. หากคุณต้องการทราบขนาดโดยรวมของไดเรกทอรีให้กระโดดเข้าไปในนั้นแล้วเรียกใช้:

du -hs

หากคุณต้องการทราบว่าโฟลเดอร์ย่อยใดใช้พื้นที่ดิสก์มาก! คุณสามารถขยายคำสั่งนี้เป็น:

du -h --max-depth=1 | sort -hr

ซึ่งจะทำให้คุณมีขนาดของโฟลเดอร์ย่อยทั้งหมด (ระดับ 1) ผลลัพธ์จะถูกจัดเรียง (โฟลเดอร์ที่ใหญ่ที่สุดอยู่ด้านบน)


ดูเหมือนว่าใน linux บางรุ่น (อาจเก่ากว่า) การเรียงลำดับไม่มีสวิตช์ h และดังนั้นคำสั่งที่ดีที่สุดถัดไปที่ฉันสามารถค้นหาได้คือ: du -c --max-depth = 1 | จัดเรียง -rn
richhallstoke

@richhallstoke หากคุณใช้ncduไฟล์ต่าง ๆ จะถูกเรียงตามขนาดจากมากไปหาน้อยตามค่าเริ่มต้น
เท้า

3
+1 สำหรับ "| sort
-hr

67

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

ncduทำให้ชีวิตของคุณง่ายและใช้งาน

ncdu

คุณจะได้รับข้อมูลสรุปโฟลเดอร์ที่สามารถเรียกดูได้อย่างง่ายดาย


9
นี่ควรเป็นคำตอบที่ถูกต้องอย่างน้อยสำหรับผู้ที่สามารถติดตั้งซอฟต์แวร์ในระบบ น่าเสียดายที่ฉันไม่คิดว่าคนส่วนใหญ่จะเลื่อนลงมามากพอที่จะเห็นสิ่งนี้
DavidR

@ RickyNotaro-Garcia Nope สิ่งนี้จะไม่สนใจวัตถุที่ซ่อนอยู่และแขวนอยู่ในไดเรกทอรีขนาดใหญ่ อาจเป็นไปได้ว่ามีวิธีแก้ปัญหาตกลงกับท่อโหล แต่ทำไมเสียชีวิตของคุณ
Teque5

@ RickyNotaro-Garcia อ่านความคิดเห็นทั้งหมดของฉัน: ความพยายามของคุณไม่สนใจวัตถุที่ซ่อนอยู่และแขวนในไดเรกทอรีขนาดใหญ่
Teque5

2
ncduเยี่ยมมากฉันมักจะค้นหาคำสั่งนี้เมื่อลืม มันเร็วนำทางง่ายและช่วยในการค้นหาโฟลเดอร์ขนาดใหญ่ได้อย่างง่ายดาย ปีงบประมาณมันพร้อมใช้งานสำหรับ macOS ด้วยและอาจเป็นเครื่องลินุกซ์ทั้งหมด
Lukas

..and คุณสามารถลบโฟลเดอร์ตรงจากncduโดยการกดdคีย์
ccpizza

32

คนอื่นพูดถึงduแต่ฉันอยากจะพูดถึงNcdu - ซึ่งเป็นรุ่น ncurses duและให้การโต้ตอบ: คุณสามารถสำรวจลำดับชั้นไดเรกทอรีโดยตรงและดูขนาดของไดเรกทอรีย่อย


26

duคำสั่งแสดงให้เห็นถึงการใช้งานดิสก์ของไฟล์

-hตัวเลือกที่จะแสดงผลในรูปแบบมนุษย์สามารถอ่านได้ (เช่น 4k, 5M, 3G)

du -h (file name)

22

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

ในตัวอย่างของคุณคุณใช้ ls -l ในไฟล์เดียวซึ่งจะส่งคืนขนาดที่แท้จริงของไฟล์ไม่ใช่ขนาดของดิสก์

หากคุณต้องการทราบขนาดไฟล์จริงเพิ่มตัวเลือก -b เพื่อ du

du -csbh .

ใช่. ฉันกำลังใช้ sdf ซึ่งบีบอัด & ลบไฟล์ไว้ดังนั้นฉันจึงไม่สามารถเข้าใจได้ว่าทำไมมันถึงรายงานตัวเลขที่ต่ำมาก ขนาดที่แท้จริงของไฟล์ที่มี ls สามารถพบได้โดยใช้: du -b
Ryan Shillington

15

โดยส่วนตัวฉันคิดว่านี่ดีที่สุดถ้าคุณไม่ต้องการใช้ ncdu

# du -sh ./*

14
df -h .; du -sh -- * | sort -hr

สิ่งนี้แสดงจำนวนพื้นที่ดิสก์ที่คุณเหลือในไดรฟ์ปัจจุบันและจากนั้นจะบอกคุณว่าไฟล์ / ไดเรคทอรีใช้เวลาเท่าไร เช่น,

Filesystem      Size  Used Avail Use% Mounted on
/dev/sdb2       206G  167G   29G  86% /
115M    node_modules
2.1M    examples
68K     src
4.0K    webpack.config.js
4.0K    README.md
4.0K    package.json

ปีงบประมาณดูเหมือนว่าจะรายงานขนาดบนดิสก์ นั่นคือมันอาจจะถูกเติมลงใน 4KB ที่ใกล้ที่สุด
mpen


9

ค้นหาไฟล์ทั้งหมดภายใต้ไดเรกทอรีปัจจุบันซ้ำและสรุปขนาดไฟล์:

find -type f -print0 | xargs -0 stat --print='%s\n' | awk '{total+=$1} END {print total}'

ฉันจะใช้-not -type dเพื่อรวมไม่เพียงขนาดของไฟล์ธรรมดา ( -type f) แต่ยังรวมถึงขนาดของลิงก์สัญลักษณ์และอื่น ๆ
anton_rh

นี่ยอดเยี่ยมเพราะคุณไม่ได้รับค่าใช้จ่ายที่จำเป็นในการจัดเก็บไฟล์ แต่ขนาดของไฟล์เองเท่านั้น
bballdave025

9

นี่คือฟังก์ชันสำหรับ. bash_aliases ของคุณ

# du with mount exclude and sort
function dusort () {
    DIR=$(echo $1 | sed 's#\/$##')
    du -scxh $(mount | awk '{print $3}' | sort | uniq \
     | sed 's#/# --  exclude=/#') $DIR/* | sort -h
}

ตัวอย่างผลลัพธ์:

$ dusort /
...
0       /mnt  
0       /sbin
0       /srv
4,0K    /tmp
728K    /home
23M     /etc
169M    /boot  
528M    /root
1,4G    /usr
3,3G    /var
4,3G    /opt
9,6G    total

สำหรับตำบล:

$ dusort .
$ dusort /var/log/


6

โปรดทราบว่าduพิมพ์พื้นที่ที่ไดเรกทอรีใช้สื่อที่มักจะใหญ่กว่าขนาดรวมของไฟล์ทั้งหมดในไดเรกทอรีเพราะduคำนึงถึงขนาดของข้อมูลเสริมทั้งหมดที่เก็บไว้ในสื่อเพื่อจัดระเบียบไดเรกทอรีตาม ด้วยรูปแบบระบบไฟล์

หากระบบไฟล์สามารถบีบอัดได้duอาจส่งออกจำนวนน้อยกว่าขนาดทั้งหมดของไฟล์ทั้งหมดเนื่องจากไฟล์อาจถูกบีบอัดภายในโดยระบบไฟล์และเพื่อให้มีพื้นที่น้อยลงในสื่อกว่าข้อมูลที่ไม่มีการบีบอัด เหมือนกันถ้ามีไฟล์กระจัดกระจาย

หากมีฮาร์ดลิงก์ในไดเร็กทอรีดังนั้นduอาจพิมพ์ค่าน้อยลงเช่นกันเนื่องจากไฟล์ต่างๆในไดเร็กทอรีอ้างถึงข้อมูลเดียวกันบนสื่อบันทึก

เพื่อให้ได้ขนาดโดยรวมที่ตรงไปตรงมาของไฟล์ทั้งหมดในไดเรกทอรีสามารถใช้นิพจน์เชลล์หนึ่งบรรทัดต่อไปนี้ (สมมติว่าเป็นระบบ GNU):

find . ! -type d -print0 | xargs -r0 stat -c %s | paste -sd+ - | bc

หรือสั้นกว่า:

find . ! -type d -printf '%s\n' | paste -sd+ - | bc

มันจะสรุปขนาดของไฟล์ที่ไม่ใช่ไดเรกทอรีทั้งหมดในไดเรกทอรี (และไดเรกทอรีย่อยซ้ำ) ทีละไฟล์ โปรดทราบว่าสำหรับ symlink จะรายงานขนาดของ symlink (ไม่ใช่ไฟล์ที่ symlink ชี้ไปที่)


5

คุณสามารถใช้ได้

du -sh directory/

และ

du -sh filename

เพื่อทราบเนื้อที่ว่างของโฟลเดอร์หรือไฟล์

df -h

จะแสดงการใช้งานดิสก์ในรูปแบบที่มนุษย์สามารถอ่านได้ - ทำเช่นนั้น

นอกจากนี้ยังมีโปรแกรม GUI Disk Usage Analyzerที่เรียกว่า


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.