วิธีรับขนาดของไฟล์หรือไดเร็กทอรีใน Linux
เมื่อคุณใช้du
คำสั่งLinux คุณจะได้รับทั้งการใช้งานดิสก์จริงและขนาดที่แท้จริงของไฟล์หรือไดเร็กทอรี เราจะอธิบายว่าเหตุใดค่าเหล่านี้จึงไม่เหมือนกัน
การใช้ดิสก์จริงและขนาดจริง
ขนาดของไฟล์และพื้นที่ในฮาร์ดไดรฟ์ของคุณนั้นแทบจะไม่เท่ากัน พื้นที่ดิสก์ถูกจัดสรรเป็นบล็อก หากไฟล์มีขนาดเล็กกว่าบล็อกระบบจะยังคงจัดสรรบล็อกทั้งหมดให้เนื่องจากระบบไฟล์ไม่มีอสังหาริมทรัพย์ให้ใช้น้อยกว่า
เว้นเสียแต่ว่าขนาดของไฟล์จะเป็นจำนวนบล็อกที่แน่นอนพื้นที่ที่ใช้ในฮาร์ดไดรฟ์จะต้องปัดเศษขึ้นเป็นบล็อกถัดไปทั้งหมด ตัวอย่างเช่นหากไฟล์มีขนาดใหญ่กว่าสองบล็อก แต่เล็กกว่าสามบล็อกก็ยังต้องใช้พื้นที่สามช่วงตึก
การวัดสองแบบใช้สัมพันธ์กับขนาดไฟล์ อันดับแรกคือขนาดจริงของไฟล์ซึ่งเป็นจำนวนไบต์ของเนื้อหาที่ประกอบเป็นไฟล์ ประการที่สองคือขนาดที่ใช้งานจริงของไฟล์บนฮาร์ดดิสก์ นี่คือจำนวนบล็อกระบบไฟล์ที่จำเป็นในการจัดเก็บไฟล์นั้น
ตัวอย่าง
ลองดูตัวอย่างง่ายๆ เราจะเปลี่ยนเส้นทางอักขระเดียวไปยังไฟล์เพื่อสร้างไฟล์ขนาดเล็ก:
echo "1"> geek.txt
ตอนนี้เราจะใช้รายการรูปแบบยาว ls
เพื่อดูความยาวไฟล์:
ls -l geek.txt
ความยาวคือค่าตัวเลขที่ตามหลังdave dave
รายการซึ่งมีขนาดสองไบต์ เหตุใดจึงเป็นสองไบต์เมื่อเราส่งเพียงอักขระเดียวไปยังไฟล์ มาดูสิ่งที่เกิดขึ้นภายในไฟล์กัน
เราจะใช้hexdump
คำสั่งซึ่งจะให้จำนวนไบต์ที่แน่นอนและอนุญาตให้เรา "ดู" อักขระที่ไม่ได้พิมพ์เป็นค่าฐานสิบหก นอกจากนี้เราจะใช้-C
ตัวเลือก (บัญญัติ) เพื่อบังคับให้เอาต์พุตแสดงค่าฐานสิบหกในเนื้อความของผลลัพธ์รวมทั้งอักขระที่เป็นตัวเลขและตัวอักษรที่เทียบเท่ากัน:
hexdump -C geek.txt
ผลลัพธ์แสดงให้เราเห็นว่าเริ่มต้นที่ offset 00000000 ในไฟล์มีไบต์ที่มีค่าเลขฐานสิบหกเป็น 31 และค่าที่มีค่าเลขฐานสิบหกเป็น 0A ส่วนทางขวามือของเอาต์พุตแสดงให้เห็นถึงค่าเหล่านี้เป็นอักขระตัวเลขและตัวอักษรทุกที่ที่เป็นไปได้
ค่าเลขฐานสิบหกของ 31 ใช้เพื่อแสดงตัวเลขหนึ่ง ค่าเลขฐานสิบหกของ 0A ใช้แทนอักขระ Line Feed ซึ่งไม่สามารถแสดงเป็นอักขระที่เป็นตัวเลขและตัวอักษรได้ดังนั้นจึงแสดงเป็นเครื่องหมายจุด (.) แทน echo
สายฟีดตัวละครที่ถูกเพิ่มโดย ตามค่าเริ่มต้นให้ echo
เริ่มบรรทัดใหม่หลังจากแสดงข้อความที่ต้องการเขียนในหน้าต่างเทอร์มินัล
ซึ่งนับรวมกับเอาต์พุตจาก ls
และเห็นด้วยกับความยาวไฟล์สองไบต์
ที่เกี่ยวข้อง: วิธีใช้คำสั่ง ls เพื่อแสดงรายการไฟล์และไดเร็กทอรีบน Linux
ตอนนี้เราจะใช้du
คำสั่งเพื่อดูขนาดไฟล์:
du geek.txt
มันบอกว่าขนาดคือสี่ แต่สี่ตัวล่ะ?
มีบล็อกแล้วมีบล็อก
เมื่อdu
รายงานขนาดไฟล์เป็นบล็อกขนาดที่ใช้จะขึ้นอยู่กับปัจจัยหลายประการ คุณสามารถระบุขนาดบล็อกที่ควรใช้ในบรรทัดคำสั่ง หากคุณไม่บังคับdu
ให้ใช้ขนาดบล็อกใดขนาดหนึ่งก็จะเป็นไปตามชุดของกฎเพื่อตัดสินใจว่าจะใช้ขนาดใด
ขั้นแรกตรวจสอบตัวแปรสภาพแวดล้อมต่อไปนี้:
- DU_BLOCK_SIZE
- BLOCK_SIZE
- ขนาดบล็อก
หากมีอยู่ขนาดบล็อกจะถูกตั้งค่าและdu
หยุดการตรวจสอบ หากไม่มีการตั้ง du
ค่าเริ่มต้นจะเป็นขนาดบล็อก 1,024 ไบต์ เว้นแต่นั่นคือตัวแปรสภาพแวดล้อมที่เรียกว่าPOSIXLY_CORRECT
ถูกตั้งค่า หากเป็นเช่นนั้นให้du
ตั้งค่าเริ่มต้นเป็นขนาดบล็อก 512 ไบต์
แล้วเราจะรู้ได้อย่างไรว่าอันไหนใช้งานอยู่? คุณสามารถตรวจสอบตัวแปรสภาพแวดล้อมแต่ละตัวเพื่อใช้งานได้ แต่มีวิธีที่เร็วกว่า ลองเปรียบเทียบผลลัพธ์กับขนาดบล็อกที่ระบบไฟล์ใช้แทน
ในการค้นหาขนาดบล็อกที่ระบบไฟล์ใช้เราจะใช้tune2fs
โปรแกรม จากนั้นเราจะใช้-l
ตัวเลือก (list superblock) ไพพ์เอาต์พุตผ่านgrep
จากนั้นพิมพ์บรรทัดที่มีคำว่า "Block"
ในตัวอย่างนี้เราจะดูระบบไฟล์ในพาร์ติชันแรกของฮาร์ดไดรฟ์ตัวแรกsda1
และเราจะต้องใช้sudo
:
sudo tune2fs -l / dev / sda1 | grep บล็อก
ขนาดบล็อกระบบไฟล์คือ 4,096 ไบต์ ถ้าเราหารด้วยผลลัพธ์ที่เราได้จากdu
(สี่) จะแสดง du
ขนาดบล็อกเริ่มต้นคือ 1,024 ไบต์ ตอนนี้เรารู้สิ่งสำคัญหลายอย่าง
อันดับแรกเราทราบว่าอสังหาริมทรัพย์ระบบไฟล์จำนวนน้อยที่สุดที่สามารถอุทิศให้กับการจัดเก็บไฟล์คือ 4,096 ไบต์ ซึ่งหมายความว่าแม้แต่ไฟล์ขนาดเล็กสองไบต์ของเราก็กินเนื้อที่ฮาร์ดไดรฟ์ถึง 4 KB
สิ่งที่สองที่จะเก็บไว้ในใจก็คือการใช้งานที่ทุ่มเทให้กับการรายงานเกี่ยวกับฮาร์ดไดรฟ์และระบบแฟ้มสถิติเช่นdu
, ls
และ tune2fs
สามารถมีความคิดที่แตกต่างกันของสิ่งที่“บล็อก” หมายถึง tune2fs
แอพลิเคชันรายงานจริงขนาดไฟล์ระบบบล็อกขณะที่ ls
และdu
สามารถกำหนดค่าหรือถูกบังคับให้ใช้ขนาดบล็อกอื่น ๆ ขนาดบล็อกเหล่านี้ไม่ได้มีวัตถุประสงค์เพื่อให้เกี่ยวข้องกับขนาดบล็อกระบบไฟล์ พวกมันเป็นเพียง "ชิ้นส่วน" คำสั่งที่ใช้ในผลลัพธ์
สุดท้ายนอกเหนือจากการใช้ขนาดบล็อกที่แตกต่างกันคำตอบจากdu
และtune2fs
สื่อความหมายเดียวกัน tune2fs
ผลเป็นหนึ่งในบล็อก 4,096 ไบต์และdu
ผลเป็นสี่บล็อกของ 1,024 ไบต์
การใช้ du
หากไม่มีพารามิเตอร์หรืออ็อพชันบรรทัดคำสั่งdu
แสดงรายการเนื้อที่ดิสก์ทั้งหมดที่ไดเร็กทอรีปัจจุบันและไดเร็กทอรีย่อยทั้งหมดกำลังใช้อยู่
ลองดูตัวอย่าง:
du
ขนาดถูกรายงานในขนาดบล็อกเริ่มต้นที่ 1,024 ไบต์ต่อบล็อก ทรีไดเร็กทอรีย่อยทั้งหมดถูกข้ามผ่าน
ใช้du
กับไดเรกทอรีอื่น
หากคุณต้องการ du
รายงานบนไดเร็กทอรีอื่นที่ไม่ใช่ไดเร็กทอรีปัจจุบันคุณสามารถส่งพา ธ ไปยังไดเร็กทอรีบนบรรทัดคำสั่ง:
du ~ / .cach / วิวัฒนาการ /
ใช้du
กับไฟล์เฉพาะ
หากคุณต้องการ du
รายงานเกี่ยวกับไฟล์ใดไฟล์หนึ่งให้ส่งเส้นทางไปยังไฟล์นั้นในบรรทัดคำสั่ง คุณยังสามารถส่งรูปแบบเชลล์ไปยังกลุ่มไฟล์ที่เลือกได้เช่น*.txt
:
du ~ / .bash_aliases
การรายงานเกี่ยวกับไฟล์ในไดเร็กทอรี
หากต้องการdu
รายงานเกี่ยวกับไฟล์ในไดเร็กทอรีปัจจุบันและไดเร็กทอรีย่อยให้ใช้-a
อ็อพชัน (all files):
du -a
สำหรับแต่ละไดเร็กทอรีขนาดของแต่ละไฟล์จะถูกรายงานรวมทั้งผลรวมสำหรับแต่ละไดเร็กทอรี
การจำกัดความลึกของแผนผังไดเรกทอรี
คุณสามารถบอกdu
ให้แสดงรายการแผนผังไดเร็กทอรีในระดับความลึกที่แน่นอน โดยใช้-d
ตัวเลือก (ความลึกสูงสุด) และระบุค่าความลึกเป็นพารามิเตอร์ โปรดทราบว่าไดเรกทอรีย่อยทั้งหมดจะถูกสแกนและใช้ในการคำนวณผลรวมที่รายงาน แต่ไม่ได้อยู่ในรายการทั้งหมด ในการตั้งค่าความลึกสูงสุดของไดเร็กทอรีหนึ่งระดับให้ใช้คำสั่งนี้:
du -d 1
เอาต์พุตแสดงรายการขนาดรวมของไดเร็กทอรีย่อยนั้นในไดเร็กทอรีปัจจุบันและยังระบุผลรวมสำหรับแต่ละไดเร็กทอรี
หากต้องการแสดงรายการไดเร็กทอรีให้ลึกขึ้นหนึ่งระดับให้ใช้คำสั่งนี้:
du -d 2
การตั้งค่าขนาดบล็อก
คุณสามารถใช้block
ตัวเลือกเพื่อกำหนดขนาดบล็อกdu
สำหรับการดำเนินการปัจจุบัน ในการใช้ขนาดบล็อกหนึ่งไบต์ให้ใช้คำสั่งต่อไปนี้เพื่อรับขนาดที่แน่นอนของไดเร็กทอรีและไฟล์:
du - บล็อก = 1
หากคุณต้องการใช้ขนาดบล็อกหนึ่งเมกะไบต์คุณสามารถใช้-m
ตัวเลือก (เมกะไบต์) ซึ่งเหมือนกับ--block=1M
:
du -m
หากคุณต้องการขนาดที่รายงานในขนาดบล็อกที่เหมาะสมที่สุดตามพื้นที่ดิสก์ที่ใช้โดยไดเร็กทอรีและไฟล์ให้ใช้-h
ตัวเลือก (มนุษย์อ่านได้)
du -h
หากต้องการดูขนาดที่ชัดเจนของไฟล์แทนที่จะเป็นจำนวนเนื้อที่ฮาร์ดไดรฟ์ที่ใช้จัดเก็บไฟล์ให้ใช้--apparent-size
ตัวเลือก:
du - ขนาดผู้ปกครอง
คุณสามารถรวมสิ่งนี้กับ-a
ตัวเลือก (ทั้งหมด) เพื่อดูขนาดที่ชัดเจนของแต่ละไฟล์:
du - ผู้ปกครองขนาด -a
แต่ละไฟล์จะแสดงพร้อมกับขนาดที่ชัดเจน
แสดงเฉพาะผลรวม
หากคุณต้องการ du
รายงานเฉพาะยอดรวมสำหรับไดเร็กทอรีให้ใช้-s
ตัวเลือก (สรุป) คุณยังสามารถรวมสิ่งนี้กับตัวเลือกอื่น ๆ เช่นตัวเลือก-h
(มนุษย์อ่านได้):
du -h -s
ที่นี่เราจะใช้กับ--apparent-size
ตัวเลือก:
du - ผู้ปกครองขนาด -s
กำลังแสดงเวลาการปรับเปลี่ยน
หากต้องการดูเวลาและวันที่สร้างหรือแก้ไขล่าสุดให้ใช้--time
ตัวเลือก:
du - เวลา -d 2
ผลลัพธ์แปลก ๆ ?
หากคุณเห็นผลลัพธ์แปลก ๆdu
โดยเฉพาะอย่างยิ่งเมื่อคุณมีขนาดการอ้างอิงข้ามไปยังเอาต์พุตจากคำสั่งอื่น ๆ มักเกิดจากขนาดบล็อกที่แตกต่างกันซึ่งสามารถตั้งค่าคำสั่งที่แตกต่างกันได้หรือเป็นค่าเริ่มต้น นอกจากนี้ยังอาจเกิดจากความแตกต่างระหว่างขนาดไฟล์จริงและเนื้อที่ดิสก์ที่ต้องใช้ในการจัดเก็บ
หากคุณต้องการจับคู่ผลลัพธ์ของคำสั่งอื่น ๆ ให้ทดลองใช้--block
ตัวเลือกในdu
.