du -h และ ls -lh แตกต่างกันอย่างไร?


31

ฉันมีเวลายากที่จะเข้าใจว่าวิธีที่ถูกต้องในการอ่านขนาดของไฟล์คืออะไรเนื่องจากแต่ละคำสั่งให้ผลลัพธ์ที่แตกต่างกัน ฉันเจอโพสต์ที่http://forums.devshed.com/linux-help-33/du-and-ls-generating-inconsistent-file-sizes-42169.htmlซึ่งระบุสิ่งต่อไปนี้

du ให้ขนาดของไฟล์ตามที่อยู่ในระบบไฟล์ (IE จะให้ผลลัพธ์ที่หารด้วย 1024 เสมอ)

ls จะให้ขนาดที่แท้จริงของไฟล์

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

อะไรคือความแตกต่างระหว่างที่อยู่ในระบบไฟล์และขนาดที่แท้จริงของไฟล์

คำตอบ:


48

สิ่งนี้เรียกว่าพื้นที่หย่อน :

แต่ละชั้นของ abstraction ที่อยู่ด้านบนของแต่ละบิตและไบต์ส่งผลให้เปลืองเนื้อที่เมื่อ datafile มีขนาดเล็กกว่าหน่วยข้อมูลที่เล็กที่สุดที่ระบบไฟล์สามารถติดตามได้ พื้นที่ที่สูญเปล่าภายในเซกเตอร์คลัสเตอร์หรือบล็อกโดยทั่วไปจะเรียกว่าพื้นที่หย่อนและโดยปกติจะไม่สามารถใช้สำหรับการจัดเก็บข้อมูลเพิ่มเติมได้ สำหรับเซกเตอร์ 256 ไบต์แต่ละรายการพื้นที่ที่สูญเปล่าสูงสุดคือ 255 ไบต์ สำหรับคลัสเตอร์ 64 กิโลไบต์พื้นที่ที่สูญเปล่าสูงสุดคือ 65,535 ไบต์

ดังนั้นหากระบบไฟล์ของคุณจัดสรรพื้นที่ในหน่วย 64 KB และคุณจัดเก็บไฟล์ 3 KB ดังนั้น:

  • ขนาดที่แท้จริงของไฟล์คือ 3 KB
  • ขนาดที่อยู่อาศัยของไฟล์คือ 64 KB เนื่องจากส่วนที่เหลือ 61 KB ในหน่วยนั้นไม่สามารถจัดสรรให้กับไฟล์อื่นและหายไปได้

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


1
นั่นคือคำอธิบายที่ดีอย่างหนึ่ง
SpacemanSpiff

1
@ Handyman5 - ขอบคุณ Handyman5 ดังนั้นเมื่อฉันดูขนาดของไฟล์หรือโฟลเดอร์โดยใช้ ls มันจะคืนค่าขนาดจริงในขณะที่ du คืนค่าขนาดที่อยู่อาศัย? ถูกต้องหรือไม่ ดังนั้นเมื่อดูที่ขนาดของไฟล์ซึ่งเป็นขนาดที่ถูกต้องที่สุดเช่นขนาดที่อยู่อาศัยหรือขนาดไฟล์หรือเป็นคำถามโดยพลการ?
PeanutsMonkey

8
@PeanutsMonkey ความแม่นยำอยู่ในสายตาของคนดู ;-) โดยทั่วไปหากคุณกังวลว่าพื้นที่ไฟล์จะใช้พื้นที่อื่นเท่าไร (เช่นการคัดลอกผ่านเครือข่ายเพิ่มไฟล์ zip สำรองข้อมูลไปยังไดรฟ์ภายนอก ฯลฯ ) ขนาดที่แท้จริงคืออะไร คุณสนใจ หากคุณกังวลเกี่ยวกับปริมาณเนื้อที่ที่เหลืออยู่ในไดรฟ์ที่ไฟล์นั้นมีอยู่ตอนนี้คุณต้องใส่ใจเรื่องขนาดของที่อยู่อาศัย เนื่องจากduกำลังแสดงให้คุณเห็นว่าdisk uปัญญาชนมันกำลังมองหาพื้นที่ที่เกิดขึ้นบนไดรฟ์ปัจจุบันและทำให้มันแสดงขนาดของถิ่นที่อยู่
Handyman5

1
@ Handyman5 - เกือบหนึ่งปีหลังจากโพสต์ แต่ฉันอยากรู้ว่าคำตอบข้างต้นแตกต่างกันdf -hอย่างไรเมื่อใช้?
PeanutsMonkey

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

19

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

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


6

ระบบไฟล์ประกอบด้วยบล็อก ไฟล์ไม่จำเป็นต้องมีขนาดพอดีกับบล็อก หากไฟล์คือ 1024 ไบต์ขนาดของมันจะเป็น ls และ du คือ 1024 ถ้าขนาดไฟล์เท่ากับ 1,025 ขนาดจะเท่ากับ 1025 ใน ls และ 2048 ใน du

หมายเหตุตัวอย่างด้านบนถือว่าขนาดบล็อก 1024 ขนาดบล็อกที่ใหญ่ขึ้นเป็นบรรทัดฐานวันนี้ e, g,

ls -l fred
-rw-r--r-- 1 iain users 1024 Jul 13 22:06 fred

du -h fred
8.0K    fred

0

ยังมีอีกเหตุผลหนึ่งที่พวกเขาอาจแตกต่างกัน du-h รู้เมื่อเห็นไฟล์เดียวกันภายใต้ชื่ออื่น (ฮาร์ดลิงก์ซึ่งตรงข้ามกับ symlink) และจะรายงานแต่ละไฟล์ว่ามีขนาดเท่าไหร่ แต่เพิ่มขนาดเพียงหนึ่งครั้งในไดเรกทอรีพาเรนต์ทั่วไป

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