จะแสดงรายการขนาดของแต่ละไฟล์และไดเร็กทอรีและจัดเรียงตามขนาดจากมากไปหาน้อยใน Bash ได้อย่างไร?


108

ฉันพบว่าไม่มีวิธีง่ายๆในการหาขนาดของไดเร็กทอรีใน Bash?

ฉันต้องการให้เมื่อฉันพิมพ์ls -<some options>มันสามารถแสดงรายการผลรวมของขนาดไฟล์ของไดเร็กทอรีและไฟล์ซ้ำ ๆ ในเวลาเดียวกันและจัดเรียงตามลำดับขนาด

เป็นไปได้หรือไม่


2
"ขนาด" ของไดเร็กทอรีหมายความว่าอย่างไร จำนวนไฟล์ที่อยู่ข้างใต้ (เรียกซ้ำหรือไม่)? ผลรวมของขนาดไฟล์ที่อยู่ข้างใต้ (เรียกซ้ำหรือไม่)? ขนาดดิสก์ของไดเร็กทอรีเอง? (ไดเร็กทอรีถูกนำไปใช้เป็นไฟล์พิเศษที่มีชื่อไฟล์และข้อมูลอื่น ๆ )
Keith Thompson

ควรเป็นผลรวมของขนาดของไฟล์ที่อยู่ด้านล่างแบบวนซ้ำ
Kit Ho

1
@Kit: แล้วduคือคำตอบ
Keith Thompson

duคำสั่ง@KeithThompson @KitHo ประมาณการการใช้พื้นที่ไฟล์ดังนั้นคุณจึงไม่สามารถใช้งานได้หากต้องการได้ขนาดที่แน่นอน
ztank1013

@ ztank1013: ขึ้นอยู่กับความหมายของ "ขนาดที่แน่นอน" du(อย่างน้อยก็คือ GNU coreutils version) อาจมีตัวเลือกในการให้ข้อมูล
Keith Thompson

คำตอบ:


218

เพียงไปที่ไดเร็กทอรีและเรียกใช้คำสั่งต่อไปนี้:

du -a --max-depth=1 | sort -n

หรือเพิ่ม -h สำหรับขนาดที่มนุษย์อ่านได้และ -r เพื่อพิมพ์ไดเร็กทอรี / ไฟล์ที่ใหญ่กว่าก่อน

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

23
du -hต้องการsort -hเช่นกันเพื่อให้แน่ใจว่าพูด981Mแบบ1.3Gนั้นมาก่อน มีsort -nเพียงตัวเลขเท่านั้นที่จะถูกนำมาพิจารณาและมันจะเป็นวิธีที่ผิด
Smylers

นี่ไม่ได้แสดงขนาดของไฟล์แต่ละไฟล์ภายในไดเร็กทอรีปัจจุบันมีเพียงขนาดของไดเร็กทอรีย่อยและขนาดรวมของไดเร็กทอรีปัจจุบัน คุณจะรวมไฟล์แต่ละไฟล์ไว้ในเอาต์พุตได้อย่างไร (เพื่อตอบคำถามของ OP)
Erik Trautman

@ErikTrautman เพื่อแสดงรายการไฟล์ที่คุณต้องเพิ่ม-aและใช้--allแทน--max-depth=1เช่นนั้นdu -a -h --all | sort -h
Franco

สุดยอด! ฉันทำอะไรที่ไม่ดีมาสองสามปีแล้ว :)
Colby Blair

6
sort -hใช้งานได้กับเวอร์ชันของ GNU / Linux เท่านั้นไม่มีโชคกับ BSD / OS X
djule5

20

เห็นได้ชัดว่า--max-depthตัวเลือกไม่ได้อยู่ในduคำสั่งเวอร์ชันของ MacOS X คุณสามารถใช้สิ่งต่อไปนี้แทนได้

du -h -d 1 | sort -n


เห็นได้ชัด แต่ไม่น่าแปลกใจ
Josh Habdas

20
du -s -- * | sort -n

(จะไม่แสดงไฟล์ที่ซ่อน (.dotfiles))

ใช้du -smสำหรับหน่วย Mb เป็นต้นฉันมักจะใช้

du -smc -- * | sort -n

เนื่องจากบรรทัดรวม ( -c) จะสิ้นสุดที่ด้านล่างด้วยเหตุผลที่ชัดเจน :)

PS:

  • ดูความคิดเห็นเกี่ยวกับการจัดการดอทไฟล์
  • ฉันมักใช้เช่น 'du -smc / home / / | sort -n | tail 'เพื่อให้รู้สึกว่าบิตขนาดใหญ่นั่งอยู่ตรงไหน

5
du --max-depth=1|sort -nหรือfind . -mindepth 1 -maxdepth 1|xargs du -s|sort -nรวมดอทไฟล์ด้วย
Arnaud Le Blanc

@arnoud: ฉันก็ใช้มันเหมือนกัน แต่ดูเหมือนจะไม่ใช่ส่วนเสริมที่ถูกต้องสำหรับคำถามนี้ (/ คำตอบ) :)
sehe

@ arnaud576875 find . -mindepth 1 -maxdepth 1 -print0 | xargs -0 du -s | sort -nหากบางเส้นทางที่พบอาจมีช่องว่าง
Lri

1
นี่เป็นตัวแปรที่ยอดเยี่ยมในการรับมุมมองที่มนุษย์สามารถอ่านได้ของสิ่งที่ใหญ่ที่สุด:sudo du -smch * | sort -h | tail
marsbard

16

คำสั่ง

du -h --max-depth=0 * | sort -hr

เอาต์พุต

3,5M    asdf.6000.gz
3,4M    asdf.4000.gz
3,2M    asdf.2000.gz
2,5M    xyz.PT.gz
136K    xyz.6000.gz
116K    xyz.6000p.gz
88K test.4000.gz
76K test.4000p.gz
44K test.2000.gz
8,0K    desc.common.tcl
8,0K    wer.2000p.gz
8,0K    wer.2000.gz
4,0K    ttree.3

คำอธิบาย

  • du แสดง "การใช้งานดิสก์"
  • h มีไว้สำหรับ "มนุษย์อ่านได้" (ทั้งแบบเรียงลำดับและใน du)
  • max-depth=0หมายความว่าduจะไม่แสดงขนาดของโฟลเดอร์ย่อย (ลบออกหากคุณต้องการแสดงทุกขนาดของทุกไฟล์ในทุก ๆ ย่อย, ย่อย -, ... , โฟลเดอร์)
  • r มีไว้สำหรับ "ย้อนกลับ" (ไฟล์ใหญ่ที่สุดก่อน)

ncdu

เมื่อฉันมาถึงคำถามนี้ฉันต้องการล้างระบบไฟล์ของฉัน เครื่องมือบรรทัดคำสั่งncduเหมาะกับงานนี้มากกว่า

การติดตั้งบน Ubuntu:

$ sudo apt-get install ncdu

การใช้งาน:

เพียงพิมพ์ncdu [path]ในบรรทัดคำสั่ง หลังจากนั้นไม่กี่วินาทีในการวิเคราะห์เส้นทางคุณจะเห็นสิ่งนี้:

$ ncdu 1.11 ~ Use the arrow keys to navigate, press ? for help
--- / ---------------------------------------------------------
.  96,1 GiB [##########] /home
.  17,7 GiB [#         ] /usr
.   4,5 GiB [          ] /var
    1,1 GiB [          ] /lib
  732,1 MiB [          ] /opt
. 275,6 MiB [          ] /boot
  198,0 MiB [          ] /storage
. 153,5 MiB [          ] /run
.  16,6 MiB [          ] /etc
   13,5 MiB [          ] /bin
   11,3 MiB [          ] /sbin
.   8,8 MiB [          ] /tmp
.   2,2 MiB [          ] /dev
!  16,0 KiB [          ] /lost+found
    8,0 KiB [          ] /media
    8,0 KiB [          ] /snap
    4,0 KiB [          ] /lib64
e   4,0 KiB [          ] /srv
!   4,0 KiB [          ] /root
e   4,0 KiB [          ] /mnt
e   4,0 KiB [          ] /cdrom
.   0,0   B [          ] /proc
.   0,0   B [          ] /sys
@   0,0   B [          ]  initrd.img.old
@   0,0   B [          ]  initrd.img
@   0,0   B [          ]  vmlinuz.old
@   0,0   B [          ]  vmlinuz

ลบองค์ประกอบที่ไฮไลต์ในปัจจุบันด้วยdออกด้วยCTRL+c


คุณยังสามารถเขียน du -hs * | เรียงลำดับ -hr. -s (สรุป) เหมือนกับ --max-depth = 0
rasmusx

5

ls -Sเรียงตามขนาด จากนั้นหากต้องการแสดงขนาดด้วยls -lSให้แสดง long ( -l) เรียงตามขนาด ( -S) ฉันมักจะเพิ่มมากเกินไปจะทำให้สิ่งที่ง่ายต่อการอ่านดังนั้น-hls -lhS


1
อาขอโทษที่โพสต์ของคุณไม่ชัดเจน คุณต้องการduดูเหมือนว่ามีคนโพสต์ไว้ @sehe: ขึ้นอยู่กับคำจำกัดความของจริง - มันกำลังแสดงจำนวนพื้นที่ที่ไดเรกทอรีใช้เพื่อจัดเก็บตัวมันเอง (ไม่ใช่แค่การเพิ่มขนาดของรายการย่อยเท่านั้น) ไม่ใช่ตัวเลขสุ่มและไม่ใช่ 4KiB เสมอไป
Thanatos


0

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

(find . -depth 1 -type f -exec ls -s {} \;; find . -depth 1 -type d -exec du -s {} \;) | sort -n

ไม่เป็นไร sehe ได้นำเสนอวิธีแก้ปัญหาที่ง่ายกว่ามาก ฉันเรียนรู้สิ่งใหม่ ๆ ทุกวัน!
dvorak

ฉันไม่คิดว่าการใช้duเป็นตัวเลือก แต่จะให้ผลลัพธ์โดยประมาณ
ztank1013

0

[รุ่นปรับปรุง]
จะเร็วและแม่นยำกว่ารุ่นเริ่มต้นด้านล่างมากและจะส่งออกผลรวมของขนาดไฟล์ทั้งหมดของไดเร็กทอรีปัจจุบัน:

echo `find . -type f -exec stat -c %s {} \; | tr '\n' '+' | sed 's/+$//g'` | bc

stat -c %sคำสั่งที่ไฟล์จะกลับขนาดไบต์ trคำสั่งที่นี่จะใช้ในการเอาชนะxargsข้อ จำกัด คำสั่ง (เห็นได้ชัดท่อจะxargsเป็นผลแยกบนเส้นมากขึ้นที่จะหมดตรรกะของคำสั่งของฉัน) ดังนั้นtrการดูแลการเปลี่ยนฟีดบรรทัดด้วย+เครื่องหมาย (บวก) sedมีเป้าหมายเดียวในการลบ+เครื่องหมายสุดท้ายออกจากสตริงผลลัพธ์เพื่อหลีกเลี่ยงการบ่นจากbcคำสั่งสุดท้าย(เครื่องคิดเลขพื้นฐาน) ซึ่งตามปกติจะคำนวณทางคณิตศาสตร์

การแสดง:ฉันทดสอบมันในหลายไดเรกทอรีและมากกว่า ~ 150.000 ไฟล์ด้านบน (จำนวนไฟล์ปัจจุบันของกล่อง fedora 15 ของฉัน) โดยมีสิ่งที่ฉันเชื่อว่ามันเป็นผลลัพธ์ที่น่าทึ่ง:

# time echo `find / -type f -exec stat -c %s {} \; | tr '\n' '+' | sed 's/+$//g'` | bc
12671767700

real    2m19.164s
user    0m2.039s
sys 0m14.850s

ในกรณีที่คุณต้องการเปรียบเทียบกับdu -sb /คำสั่งมันจะแสดงการใช้งานดิสก์โดยประมาณเป็นไบต์ ( -bตัวเลือก)

# du -sb /
12684646920 /

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

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

ฉันคิดว่าอาจมีหลายวิธีในการตอบคำถามของคุณ แต่นี่เป็นของฉัน:

ls -l $(find . -type f | xargs) | cut -d" " -f5 | xargs | sed 's/\ /+/g'| bc

พบไฟล์ทั้งหมดภายใต้. ไดเร็กทอรี (เปลี่ยนด้วยไดเร็กทอรีใดก็ได้ที่คุณต้องการ) รวมถึงไฟล์ที่ซ่อนอยู่และ (ใช้xargs) แสดงชื่อของพวกเขาในบรรทัดเดียวจากนั้นสร้างรายการโดยละเอียดโดยใช้ls -l. เอาต์พุตขนาดใหญ่นี้ (บางครั้ง) จะถูกส่งไปยังคำสั่งตัดและมีเพียงฟิลด์ที่ห้า ( -f5) ซึ่งเป็นขนาดไฟล์เป็นไบต์เท่านั้นที่จะถูกนำมาใช้และทำการไพพ์อีกครั้งxargsซึ่งจะสร้างขนาดบรรทัดเดียวอีกครั้งโดยคั่นด้วยช่องว่าง ตอนนี้ใช้เวทมนตร์ sed ซึ่งแทนที่ช่องว่างแต่ละช่องด้วยเครื่องหมายบวก ( +) และในที่สุดbc(เครื่องคิดเลขพื้นฐาน) จะคำนวณทางคณิตศาสตร์

อาจต้องปรับแต่งเพิ่มเติมและคุณอาจมีlsคำสั่งที่บ่นเกี่ยวกับรายการอาร์กิวเมนต์ยาวเกินไป


หากไดเร็กทอรีมีขนาดใหญ่เกินไปมันจะวางสายเป็นเวลานานพยายามทำงานในโฮมไดเร็กทอรีของคุณ: p
Kit Ho

@KitHo ดีฉันกลัวว่าไม่มีวิธีที่ง่ายและรวดเร็วในการรับผลลัพธ์ที่แม่นยำโดยไม่ต้องค้นหาทุกไฟล์และเพิ่มขนาดดังนั้นคำสั่งความเกียจคร้านส่วนใหญ่ขึ้นอยู่กับจำนวนไฟล์ที่อยู่ภายใต้ไดเรกทอรีการค้นหา ... แต่ฉันเชื่อว่ามี เป็นขอบสำหรับการปรับปรุง ... ความท้าทายที่ดี!
ztank1013

@KitHo เดี๋ยวก่อนดูเวอร์ชันปรับปรุงในคำตอบของฉัน ... และแจ้งให้เราทราบแน่นอน!
ztank1013

0

อีกวิธีง่ายๆ

$ for entry in $(ls); do du -s "$entry"; done | sort -n

ผลลัพธ์จะเป็นอย่างไร

2900    tmp
6781    boot
8428    bin
24932   lib64
34436   sbin
90084   var
106676  etc
125216  lib
3313136 usr
4828700 opt

การเปลี่ยน "du -s" เป็น "du -sh" จะแสดงขนาดที่มนุษย์อ่านได้ แต่เราจะไม่สามารถจัดเรียงในวิธีนี้ได้


0

คุณสามารถใช้ด้านล่างเพื่อแสดงรายการไฟล์ตามขนาด du -h | เรียง -hr | มากกว่าหรือ du -h --max-depth = 0 * | เรียง -hr | มากกว่า


0

ฉันมักจะใช้ du ด้วยวิธีง่ายๆ

du -sh */ | sort -n

สิ่งนี้ทำให้ฉันทราบว่าไดเรกทอรีใดใช้พื้นที่มากที่สุด จากนั้นฉันจะทำการค้นหาที่แม่นยำขึ้นได้ในภายหลัง


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