क्यों अजगर के os.stat और du और ls ब्लॉक आकार पर सहमत नहीं हैं?


0

एक साधारण फ़ंक्शन लिखते समय, जो एक निर्देशिका में खपत ब्लॉकों की मात्रा की गणना करता है, मैंने डु के साथ यह देखने के लिए जाँच की कि मुझे एक ही उत्तर मिल रहा है।

एलएस और डू क्यों कहते हैं कि यह फ़ाइल 16 ब्लॉकों पर कब्जा करती है?

#!/bin/bash                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           

targetfile=/scratch/blob
rm -rf /scratch > /dev/null 2>&1
mkdir -p /scratch > /dev/null 2>&1
bs=$(dumpe2fs -h /dev/mapper/testvm-root 2> /dev/null | grep "Block size:")
bs=${bs/Block size:/}
bs=${bs// /}
echo blocksize=$bs
# create a file slightly too big for three blocks
dd if=/dev/zero of=$targetfile count=1 bs=$((bs*3+1)) > /dev/null 2>&1

echo "du says $(du $targetfile) units"
echo "du says $(du -b $targetfile) bytes:"
echo "ls says $(ls -s $targetfile) blocks"

echo "python says:"
python <(cat <<ENDMARKER
import os
import math
x = os.stat("$targetfile")
blocks=math.ceil(float(x.st_size)/float(x.st_blksize))
print("%d bytes st_blksize=%d, %d blocks " % (x.st_size,x.st_blksize,blocks))
print("blocksize=%d" % os.statvfs("$targetfile").f_bsize)
ENDMARKER
)

यह वही है जो मैं देख रहा हूं:

blocksize=4096
du says 16      /scratch/blob units
du says 12289   /scratch/blob bytes:
ls says 16 /scratch/blob blocks
python says:
12289 bytes st_blksize=4096, 4 blocks 
blocksize=4096

मैं उम्मीद करूंगा कि ls -s को 4 ब्लॉक कहने चाहिए जैसे du -B 4096 करता है।


संभवतः संबंधित: unix.stackexchange.com/questions/120311/…
strugee

यह एक अच्छा पढ़ा है, लेकिन वास्तव में मेरे सवाल का जवाब नहीं है। डु मैन पेज को फिर से पढ़ने पर, मैं देखता हूं कि डिफ़ॉल्ट रूप से यह 512-बाइट ब्लॉकों की इकाइयों में उपयोग की रिपोर्ट करता है। मुझे समझ में नहीं आता कि क्यों, लेकिन कम से कम मुझे उम्मीद है कि संख्या मिल जाएगी।
जॉन श्मिट

जवाबों:


2

ब्लॉक की संख्या की गणना करते समय दोनों duऔर ls1024 बाइट्स के ब्लॉक आकार के लिए डिफ़ॉल्ट। चूंकि आपका फाइलसिस्टम 4K ब्लॉक से कॉन्फ़िगर किया गया है, और फ़ाइल 4 ऐसे 4K ब्लॉक का उपयोग करती है, दोनों की रिपोर्ट 16 1K- ब्लॉक का उपयोग करती है।

du (1) manpage ने अपने विवरण अनुभाग के अंत में इस तथ्य का उल्लेख किया है, जबकि ls (1) इसे सीधे नहीं बताता है। हालाँकि, दोनों कार्यक्रम GNU कोरूटिल्स सूट का एक हिस्सा हैं और समान -B / - ब्लॉक-आकार विकल्पों का समर्थन करते हैं, इसलिए मुझे लगता है कि वे एक ही कार्यान्वयन पर भरोसा करने की संभावना रखते हैं।

आप का इस्तेमाल किया ब्लॉक की वास्तविक संख्या प्राप्त करना चाहते हैं, तो आप दोनों के लिए फाइल सिस्टम ब्लॉकसाइज प्रदान करने के लिए lsऔर du


--ब्लॉक-साइज = 4096 को डु और एलएस के लिए उपयोग करने से पता चलता है कि मुझे क्या उम्मीद है।
जॉन श्मिट
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.