ฉันจะรับขนาดของไดเรกทอรี Linux หรือ Mac OS X จากบรรทัดคำสั่งได้อย่างไร [ซ้ำ]


74

ฉันใช้คำสั่งอะไรเพื่อค้นหาขนาดของไฟล์ทั้งหมด (เรียกซ้ำ) ในไดเรกทอรี Linux หรือ Mac OS X


2
คุณสามารถใช้-kตัวเลือกเพื่อใช้ขนาดบล็อก 1K-byte
Zoker

ฉันแค่อยากจะแนะนำซอฟต์แวร์ฟรีนี้ชื่อว่า Disk Inventory X ดาวน์โหลดที่นี่derlien.comมันใช้ง่ายสำหรับ mac osx
Nimitack

แทนที่จะduใช้ฉันncduคุณสามารถหาข้อมูลอ้างอิงได้ที่นี่remysharp.com/2018/08/23/cli-improved
Alan Dong

คำตอบ:


82

เวอร์ชัน BSD ที่duใช้ใน OS X รายงานขนาดที่มีบล็อก 512- ไบต์ - ขนาดจะถูกปัดเศษขึ้นเป็นค่า 512- ไบต์ต่อไป สิ่งนี้บอกพื้นที่บนดิสก์ซึ่งมีขนาดใหญ่กว่าปริมาณข้อมูล หากคุณมีไฟล์ขนาดเล็กจำนวนมากความแตกต่างอาจมีขนาดใหญ่

นี่คือตัวอย่าง

duนี่คือค่ากับปกติ มันอยู่ในบล็อกขนาด 512- ไบต์:

$ du -s
248   .

-hผลธงในจำนวนอ่านได้มากขึ้นเป็นกิโลไบต์ อย่างที่คาดไว้มันเป็นจำนวนครึ่งหนึ่งของบล็อก 512- ไบต์:

$ du -hs
124K  .

ในที่สุดคุณสามารถใช้findและawkเพื่อให้ผลรวมของไบต์ที่เกิดขึ้นจริงในไฟล์ นี่เป็นชนิดที่ช้า แต่ใช้งานได้:

$ find . -type f -exec ls -l {} \; | awk '{sum += $5} END {print sum}'
60527

ค่านี้ตรงกับจำนวนที่รายงานโดยหน้าต่างรับข้อมูลของ Finder's (ไม่มีงาแปลกหรือ xattrs ในชุดของแฟ้มนี้.) duมันเป็นอย่างมีนัยสำคัญน้อยกว่าค่าที่รายงานโดย

นี่คือวิธีการทำงาน: รับรายการไฟล์ทั้งหมดและส่งต่อไปยังls -l; จากนั้นawkจะใช้ในการนับไบต์ -type fธงเพื่อให้มีเฉพาะไฟล์ (และไม่ไดเรกทอรี) lsได้ส่งไปยัง หากไม่มีการตั้งค่าสถานะนั้นมันจะส่งชื่อไดเรกทอรีไปยังlsและแต่ละไฟล์จะมีรายชื่อสองครั้ง: หนึ่งครั้งสำหรับแต่ละไฟล์และอีกครั้งหนึ่งเป็นรายการในไดเรกทอรี

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


คำอธิบายที่ดี ที่น่าสนใจเมื่อใช้duจาก GNU coreutils ด้วย-bตัวเลือกที่ฉันได้รับผลลัพธ์ที่แตกต่างกว่ากับfindท่อของคุณ สำหรับไดเรกทอรี 36 GB ฉันได้รับความแตกต่าง 82 KB
Stefan Schmidt

มีวิธีใดที่จะพิมพ์สิ่งนี้ในรูปแบบที่อ่านง่ายขึ้น
anon58192932

75

แสดงขนาดของไฟล์เดียว

du -h path_to_a_file

แสดงขนาดของเนื้อหาของไดเรกทอรีแต่ละไดเรกทอรีย่อยและแต่ละไฟล์:

du -h path_to_a_directory

แสดงขนาดของเนื้อหาของไดเรกทอรี:

du -sh path_to_a_directory


25
du -schถ้าคุณต้องการสิ่งที่อ่านง่ายขึ้น
Joey

@ โจฮันฉันคิดว่าคุณควรโพสต์ความคิดเห็นนี้เป็นคำตอบดังนั้นจึงสามารถยอมรับได้?
Arjan

ฉันพบตัวเลือก -c ซ้ำซ้อน (อย่างน้อยใน Mac OS X) และ du -sh แทนที่ผลรวมย่อย
Daryl Spitzer

อ้าฉันไม่รู้ว่าใครจะยอมรับคำตอบของตัวเอง ขณะนี้มีคนอย่างน้อยทราบว่าคำถามได้รับการแก้ไขแล้ว
Arjan

ฉันจะยอมรับคำตอบใหม่อย่างมีความสุขซึ่งเป็นการปรับปรุงในของฉัน
Daryl Spitzer

9

du - บอกการใช้งานดิสก์ไม่ได้ขนาดไฟล์

find . -type f -print0 | xargs -0 stat -f%z | awk '{b+=$1} END {print b}'

เหนือรหัสเทอร์มินัล (im on osx 10.6) ให้ผลลัพธ์ที่ดีที่สุดแก่ฉันและเร็วกว่า "find ... -exec"

มาตรฐานที่รวดเร็ว

time find . -type f -print0 | xargs -0 stat -f'%z' | awk '{b+=$1} END {print b}'
4744010970

real    0m0.086s
user    0m0.029s
sys 0m0.073s

time find . -type f -exec ls -l {} \; | awk '{sum += $5} END {print sum}'
4744010970

real    0m18.515s
user    0m2.929s
sys 0m9.339s

หากคุณต้องการทำเช่นเดียวกันกับ Ubuntu:find . -type f -print0 | xargs -0 stat -c%s | awk '{b+=$1} END {print b}'
Rodrigo Polo

มีวิธีที่จะได้ผลลัพธ์นี้ในรูปแบบที่มนุษย์อ่านได้หรือไม่?
anon58192932

5

คุณสามารถใช้du -ah .ขนาดที่แสดงไฟล์และไดเรกทอรีทั้งหมดซ้ำ

สิ่งนี้สามารถใช้ร่วมกับsortดังนั้นคุณจะเห็นไดเรกทอรีที่ใหญ่ที่สุด 20 อันดับแรกในโฟลเดอร์ปัจจุบัน:

du -ah . | sort -rh | head -20

หมายเหตุ: ตัวเลือก-hสำหรับการsortไม่สามารถใช้ได้ใน OSX / BSD เพื่อให้คุณได้ในการติดตั้งsortจากcoreutils(เช่นผ่านทางbrew) และใช้เส้นทางถังไปPATHเช่น

export PATH="/usr/local/opt/coreutils/libexec/gnubin:$PATH" # Add a "gnubin" for coreutils.

มิฉะนั้นใช้:

du -a . | sort -rn | head -20

คำสั่งแรกไม่ทำงานบน macOS ของฉัน 10.12.1 #du -ah | เรียง -rh | การจัดเรียงหัว -20: ตัวเลือกที่ไม่ถูกต้อง - h ลอง `จัดเรียง - ช่วย 'สำหรับข้อมูลเพิ่มเติม
nucleartux

2
@nucleartux ตรวจสอบหมายเหตุด้านล่างคำสั่ง นี้ทำงานในการเรียงลำดับ GNU ซึ่งคุณสามารถติดตั้งบน MacOS ผ่าน: brew install coreutilsมิฉะนั้นใช้คำสั่ง BSD -hการจัดเรียงที่ปลายโดยไม่ต้อง
kenorb

2

ฉันรวมแอปทั้งหมดของคุณและรวมเข้ากับเอาต์พุตที่มนุษย์อ่านได้ผลลัพธ์คือ:

#!/bin/sh
find $1 -type f -print0 | xargs -0 stat -f'%z' | awk '{b+=$1} END {print b}' | awk '{ sum=$1 ; hum[1024**3]="Gb";hum[1024**2]="Mb";hum[1024]="Kb"; for (x=1024**3; x>=1024; x/=1024){ if (sum>=x) { printf "%.2f %s\n",sum/x,hum[x];break } }}'

เชื่อมโยงไปยังส่วนสำคัญ: https://gist.github.com/mlegenhausen/9365461

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