วิธีรับขนาดของไฟล์หรือไดเร็กทอรีใน 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.