ฉันสามารถใช้ls -lเพื่อรับขนาดแบบลอจิคัลของไฟล์ แต่มีวิธีการรับขนาดทางกายภาพของไฟล์หรือไม่?
ฉันสามารถใช้ls -lเพื่อรับขนาดแบบลอจิคัลของไฟล์ แต่มีวิธีการรับขนาดทางกายภาพของไฟล์หรือไม่?
คำตอบ:
ls -lจะให้ขนาดที่ชัดเจนของไฟล์ซึ่งเป็นจำนวนไบต์ที่โปรแกรมอ่านถ้ามันอ่านไฟล์ตั้งแต่ต้นจนจบ duจะให้ขนาดของไฟล์ "บนดิสก์"
โดยค่าเริ่มต้นduจะให้ขนาดของไฟล์เป็นจำนวนบล็อกดิสก์ แต่คุณสามารถใช้-hเพื่อรับหน่วยที่มนุษย์สามารถอ่านได้แทน ดูคู่มือสำหรับduระบบของคุณ
โปรดทราบว่าด้วย GNU coreutil ของdu(ซึ่งอาจเป็นสิ่งที่คุณมีบน Linux) -bเพื่อรับ bytes หมายถึง--apparent-sizeตัวเลือก นี่ไม่ใช่สิ่งที่คุณต้องการใช้เพื่อรับจำนวนไบต์ที่ใช้จริงบนดิสก์ แต่การใช้งานหรือ--block-size=1-B 1
ด้วย GNU lsคุณสามารถทำได้ls -s --block-size=1ด้วยไฟล์ นี่จะให้หมายเลขเดียวdu -B 1กับไฟล์
ตัวอย่าง:
$ ls -l file
-rw-r--r-- 1 myself wheel 536870912 Apr 8 11:44 file
$ ls -lh file
-rw-r--r-- 1 myself wheel 512M Apr 8 11:44 file
$ du -h file
24K file
$ du -B 1 file
24576 file
$ ls -s --block-size=1 file
24576 file
นี่หมายความว่าเป็นไฟล์ 512 MB ที่ใช้เวลาประมาณ 24 KB บนดิสก์ มันเป็นไฟล์กระจัดกระจาย (ส่วนใหญ่เป็นศูนย์ที่ไม่ได้เขียนลงดิสก์ แต่แสดงเป็น "หลุม" ตรรกะในไฟล์) ไฟล์กระจัดกระจายเป็นเรื่องปกติเมื่อทำงานกับไฟล์ขนาดใหญ่ที่จัดสรรล่วงหน้าเช่นอิมเมจดิสก์สำหรับเครื่องเสมือนหรือไฟล์สว็อปเป็นต้นการสร้างไฟล์แบบเบาบางนั้นรวดเร็วในขณะที่การเติมด้วยเลขศูนย์จะช้า (และไม่จำเป็น)
ดูคู่มือสำหรับfallocateระบบ Linux ของคุณ
duจะแสดงจำนวนข้อมูลที่สามารถอ่านได้จริงในขณะที่lsแสดงขอบเขตการจัดสรรดิสก์
duแสดงจำนวนดิสก์ที่ใช้งานจริงโดยไฟล์ในขณะที่ขนาดชัดเจน (ขนาดตรรกะ) ที่แสดงโดยlsจำนวนไบต์ที่โปรแกรมสามารถอ่านได้ หากไฟล์มีขนาดเล็กบางส่วนของไบต์ที่อ่านจะเป็นศูนย์ แต่จะยังคงถูกส่งไปยังโปรแกรมที่อ่าน (ไม่ใช่จากดิสก์)
ฉันได้ขนาดไฟล์เป็นไบต์เช่นนี้:
actualsize=$(du -b "${file}" | cut -f 1)