ความแตกต่างในการคำนวณขนาดไดเรกทอรี


9

ฉันต้องการขนาดไดเรกทอรีในเทอร์มินัลเพื่อการลงนาม ฉันใช้คำสั่งต่อไปนี้:

du -s /path/to/dir

ฉันคูณผลลัพธ์ด้วยขนาดบล็อก UNIX ดั้งเดิม (512 ไบต์) และรับขนาดไดเรกทอรีจริงเป็นไบต์ อย่างไรก็ตามหน้าต่างโต้ตอบของ Finder's "Get Info" จะแสดงขนาดที่เล็กกว่าขนาดที่คำนวณด้วยคำสั่งเทอร์มินัลเล็กน้อย และดูเหมือนว่ามันจะทำซ้ำได้ในโฟลเดอร์ / กลุ่มใด ๆ ฉันพลาดอะไรไป

คำตอบ:


11

โดยปกติduจะแสดงข้อมูลเกี่ยวกับการใช้งานดิสก์ (ซึ่งเป็นที่มาของชื่อ) พึงระลึกไว้เสมอว่า

disk usage != sum of file sizes

เพราะแต่ละไฟล์ใช้จำนวนบล็อกบนระบบไฟล์ (ดูman mkfs.ext2ตัวอย่าง) ซึ่งหมายความว่าเฉพาะในสถานการณ์ที่หายากมากที่การใช้ดิสก์ของไฟล์เท่ากับขนาดที่แท้จริง - สำหรับขนาดนั้นจะต้องมีขนาดเท่ากันหลายเท่าของขนาดบล็อก

นึกถึงการบล็อกระบบไฟล์เป็นกล่องที่มีชิ้นส่วนของไฟล์แต่ละอันสามารถมีส่วนหนึ่งของไฟล์เดียว

สำหรับรุ่น GNU duให้ตรวจสอบ--apparent-sizeตัวเลือก


สถานการณ์ที่น่าสนใจยิ่งขึ้นสามารถเกิดขึ้นได้เมื่อมีไฟล์กระจัดกระจายในระบบไฟล์!


ไม่มีตัวเลือกดังกล่าว (ฉันใช้ OS X ไม่ใช่ Linux) อาจจำเป็นต้องพูดถึงในคำถามเนื่องจากแท็กไม่เพียงพอ)
Eimantas

อาขวา ... จากนั้นมีลักษณะที่ manpage และพยายามที่จะหาการอ้างอิงถึงหรือactual apparent(โปรดดูคำอธิบายที่อัปเดตของฉันด้วย)
rozcietrzewiacz

2
ถูกต้องยกเว้นความไม่เท่าเทียม ขนาดไฟล์บางครั้งอาจใหญ่กว่าพื้นที่ดิสก์จริงที่จำเป็นในการจัดเก็บ ( unix.stackexchange.com/q/33801/9426 )
Stéphane Gimenez

@ StéphaneGimenezว้าว ... ขอบคุณที่บอกฉัน!
rozcietrzewiacz

2

เกี่ยวกับ Mac OS X และ Finder (ใน Snow Leopard, รุ่น 10.6.8) ฉันสังเกตเห็นสิ่งต่อไปนี้

  • ฉันได้รับจำนวนไบต์สำหรับตัวเลข 'ปริมาณ' ของพา ธ ของ Finder's (ไฟล์หรือโฟลเดอร์) ด้วยรหัส (ในbash(1)) ด้านล่าง
  • หน้าต่างและบานหน้าต่าง "ข้อมูล" ของ Finder ค้นหาแสดงตัวเลข 'ปริมาณ' (เช่นกิโลกรัมเป็น KB) ในหน่วยทศนิยม (ฐาน 10, 1000) ไบต์ซึ่งตรงข้ามกับไบนารี (ฐาน 2, 1024) ดังนั้นฉันจึงหาปริมาณโดยหารด้วย 1,000 และเพิ่มหน่วยนำหน้า (ไบต์) 'ส่วนขยาย' (ขนาด) และทำการปัดเศษ "off key" ที่แปลก (รหัสเต็มของฉันเต็มไปด้วยรหัสพัฒนาที่ไม่ได้คอมเม้นท์และแบ่งออกเป็นหลายไฟล์ (และภาษา) ดังนั้นจึงยากที่จะแบ่งปัน)
    เท่าที่ฉันได้เห็นตัวเลข 'เชิงปริมาณ' ของฉันเหมือนกับตัวเลข 'เชิงปริมาณ' ใน Finder .
  • นอกจากนี้พร้อมกับรหัสที่ฉันต้องการจะบอกว่าฉันไม่มีตัวแปรสภาพแวดล้อม (และไม่เคยมี) BLOCKSIZEตั้งอยู่ในเปลือกของฉัน แต่ฉันทดสอบ (ตอนนี้เล็กน้อย) ทั้งรุ่นและค่าเริ่มต้นสำหรับ$BLOCKSIZEให้ค่าเดียวกัน

#!/usr/bin/env bash
#tab-width:4
                                 du -s                      "${@:-.}"   |awk '{u+=$1}END{   print  u*'${BLOCKSIZE:-0512}'   }'||exit $?         #macosx  (xnu)
#                               gdu -sB${BLOCKSIZE:-4096}   "${@:-.}"   |awk '{u+=$1}END{   print  u*'${BLOCKSIZE:-4096}'   }'||exit $?         #macports gnu

  • หมายเลขที่ฉันยังไม่ได้รับการจัดการให้ตรงกัน
    สิ่งเดียวที่ฉันสามารถพูดได้ก็คือฉันเข้ามาใกล้ด้วยการนับเฉพาะไฟล์ (เช่นไม่รวมไดเรกทอรี ~ 'meta-file system / meta index / header' ~ data) และที่ใกล้ที่สุดที่ฉันได้รับมีดังต่อไปนี้

#!/usr/bin/env bash
#tab-width:4
    for a;do find "$a" -type f -print0|xargs -0      stat -f %z         |awk '{u+=$1}END{   print  u                        }'||exit $?;done    #macosx  (xnu)
#   for a;do find "$a" -type f -print0|xargs -0     gstat -c %s         |awk '{u+=$1}END{   print  u                        }'||exit $?;done    #macports gnu
  • ดูเหมือนว่า (xnu) du(1) และ (gnu) gdu(1) จะไม่นับแอตทริบิวต์เพิ่มเติม ( xattr)

และจากนั้นฉันจะต้องเล่นสำนวน 'เรียกใช้เส้นทางและทำคณิตศาสตร์'
ความสงบสุขและราตรีสวัสดิ์สำหรับเวลานี้


1

บนระบบ Ubuntu ของฉันโดยใช้ ext4 du -b fileจะให้ขนาดเป็นไบต์ของไฟล์จริงและdu -b dirให้ขนาดเป็นไบต์ของไฟล์ + ไดเรกทอรีค่าใช้จ่ายไดเรกทอรีค่าใช้จ่ายคือในกรณีของฉันทวีคูณของ 4096 ไบต์ ..

โอเวอร์เฮดนี้เพิ่มขึ้นตามจำนวนไฟล์ที่เพิ่มขึ้น
หมายเหตุ: แม้ว่าไฟล์จะถูกลบ แต่โอเวอร์เฮดของไดเร็กทอรีจะยังคงอยู่ในระดับที่สูงกว่าเดิมก่อนที่ไฟล์จะถูกลบทิ้ง

ฉันไม่ได้ลองรีบูตเครื่องเพื่อดูว่ามันถูกเปลี่ยนกลับ แต่ในกรณีใดกรณีหนึ่งนั่นหมายความว่าขนาดไดเรกทอรีแตกต่างกันไปตามสถานการณ์ในอดีต

การรับทราบขนาดไฟล์แต่ละไฟล์อาจเป็นตัวเลือกที่ดีที่สุดสำหรับค่าที่ถูกต้องของขนาด ไฟล์ทั้งหมด

สคริปต์ต่อไปนี้รวมขนาดไฟล์ทั้งหมด (เป็นไบต์)

สำหรับ OS X หากคุณไม่มี-bopton สำหรับ 'du' คุณสามารถใช้statแทน (ถ้าคุณมี:) ... บรรทัดความคิดเห็นแสดงstatทางเลือกอื่นของUbuntu du -b;

unset total
while IFS= read -r -d $'\0' rf; do
  # (( total += $(stat  "$rf" | sed -nre 's/^  Size: ([0-9]+).*/\1/p') ))
    (( total += $(du -b "$rf" | cut -f 1) ))
done < <(find  . -type f  -name '*' -print0)
echo $total

2
OSX ไม่ได้du -bและที่แตกต่างกัน statสคริปต์ของคุณไม่สามารถพกพาได้นอก Linux ด้วยวิธีใดวิธีหนึ่ง
Gilles 'หยุดความชั่วร้าย'

ด้วย MacPorts บน OS X คุณสามารถติดตั้งcoreutilsจะได้รับรุ่น GNU ของเป็นdu gduดังนั้นมันจึงไม่สามารถพกพาได้อย่างแน่นอนแต่อาจมีประโยชน์สำหรับผู้ใช้บน OS X เพื่อรับ GNU เวอร์ชันหลัก ๆ
drfrogsplat

1

รวมไฟล์ทั้งหมดในไดเรกทอรี:

OSX: find dir ! -type d -print0 | xargs -0 stat -f '%z' | awk '{sum += $1} END{print sum}'

ลินุกซ์: find dir ! -type d -printf "%s\n" | awk '{sum += $1} END{print sum}'


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