निर्देशिका आकार गणना अंतर


9

मुझे हस्ताक्षर करने के उद्देश्यों के लिए टर्मिनल में निर्देशिका का आकार प्राप्त करने की आवश्यकता है। मैं निम्नलिखित आदेश का उपयोग कर रहा हूं:

du -s /path/to/dir

मैं पारंपरिक UNIX ब्लॉक आकार (512 बाइट्स) द्वारा परिणाम गुणा कर रहा हूं और बाइट्स में वास्तविक निर्देशिका आकार प्राप्त कर रहा हूं। हालांकि, खोजक की "जानकारी प्राप्त करें" संवाद खिड़की टर्मिनल कमांड के साथ गणना की गई की तुलना में आकार को थोड़ा छोटा दिखाती है। और ऐसा लगता है कि यह किसी भी फ़ोल्डर / बंडल पर प्रतिलिपि प्रस्तुत करने योग्य है। मैं क्या खो रहा हूँ?

जवाबों:


11

आम तौर पर, डिस्क के उपयोग (जो इसका नाम कहां से आता है) के duबारे में जानकारी दिखाता है। ध्यान रखें कि

disk usage != sum of file sizes

क्योंकि प्रत्येक फ़ाइल फ़ाइल सिस्टम पर कई ब्लॉक लेता है ( man mkfs.ext2उदाहरण के लिए देखें )। इसका मतलब यह है कि केवल बहुत ही दुर्लभ स्थिति में एक फ़ाइल का डिस्क उपयोग इसके वास्तविक आकार के बराबर होता है - इसके लिए, आकार बिल्कुल ब्लॉक आकार का एक से अधिक होना चाहिए।

फाइलसिस्टम ब्लॉक्स को उन बक्सों के रूप में सोचें जिनमें फाइलें शामिल हैं - प्रत्येक में केवल एक फाइल का एक हिस्सा हो सकता है।

GNU संस्करण के लिए du, --apparent-sizeविकल्प देखें।


एक और भी दिलचस्प स्थिति हो सकती है, जब फ़ाइल सिस्टम पर कुछ विरल फाइलें होती हैं!


ऐसा कोई विकल्प नहीं है (मैं ओएस एक्स पर हूं, लिनक्स नहीं)। शायद यह उल्लेख करने की आवश्यकता है कि एक प्रश्न में, क्योंकि टैग पर्याप्त नहीं है।)
एमान्तास

आह, ठीक है ... फिर मैनपेज पर एक नज़र डालते हैं और actualया उसके संदर्भ खोजने की कोशिश करते हैं apparent। (मेरी अद्यतन व्याख्या भी देखें)।
रोज़ज़ेट्रिएवेज़ज़ सिप

2
असमानता को छोड़कर सही। फ़ाइल आकार कभी-कभी उन्हें संग्रहीत करने के लिए आवश्यक वास्तविक डिस्क स्थान से बड़ा हो सकता है। ( unix.stackexchange.com/q/33801/9426 )
स्टीफन जिमेनेज़

@ StéphaneGimenez वाह ... मुझे बताने के लिए धन्यवाद!
rozcietrzewiacz

2

मैक ओएस एक्स और खोजक के बारे में (हिम तेंदुए में, संस्करण 10.6.8) मैंने निम्नलिखित पर ध्यान दिया है।

  • मुझे bashनीचे कोड के साथ एक पथ (फ़ाइल या फ़ोल्डर) के खोजक के 'परिमाणित' आंकड़े के लिए बाइट काउंट मिलता है ।
  • खोजक "जानकारी" विंडो और फलक बाइनरी (बेस 10, 1000) बाइट्स के विपरीत दशमलव (बेस 10, 1000) बाइट्स में 'क्वांटिफाइड' (उदाहरण केओ में किलो) के आंकड़ों को दिखाता है, तो मैं विभाजित करके 'क्वांटिफाई' करता हूं। 1000 और यूनिट (बाइट) को उपसर्ग बढ़ाकर 'क्वांटिफायर' (परिमाण) और कुछ अजीब "बंद कुंजी" गोलाई। (मेरा पूरा कोड आउट-कमेंट डेवलपमेंट कोड से भरा हुआ है और इसे कई फाइलों (और भाषाओं) में विभाजित किया गया है, इसलिए इसे साझा करना कठिन है।)
    जहां तक ​​मैंने अपने 'क्वांटिफाइड' आंकड़े देखे हैं, फाइंडर में 'क्वांटिफाइड' आंकड़े के समान है ।
  • इसके अलावा, कोड के साथ मैं कहना चाहता हूं कि 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

  • अयोग्य संख्या मैं मिलान करने में कामयाब नहीं हुआ।
    केवल एक ही बात मैं कह सकता हूं कि मैं केवल गिनती की फाइलों द्वारा पास हो जाता हूं (इस प्रकार निर्देशिका ~ 'फ़ाइल-सिस्टम मेटा इंडेक्स / हेडर' डेटा को छोड़कर) और यह कि मुझे जो निकटतम मिल रहा है वह निम्नलिखित के साथ है।

#!/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
  • न तो (विष्णु) du(1) और न ही (गन्नू) (1) gduविस्तारित विशेषताओं को गिनता है ( xattr)

और फिर मैं सिर्फ चाहिए यमक 'पथ भागो और गणित'
शांति बाहर और शुभरात्रि इस समय fo'real।


1

मेरे Ubuntu सिस्टम पर, ext4 का उपयोग करके, du -b fileएक वास्तविक फ़ाइल के du -b dirबाइट्स में आकार देता है , और फ़ाइल के बाइट्स में आकार देता है (ओं) + निर्देशिका ओवरहेड, ओवरहेड है, मेरे मामले में, 4096 बाइट्स के गुणक ।।

फाइलों की संख्या बढ़ने के साथ यह ओवरहेड बढ़ता है।
नोट: यदि फ़ाइलें हटा दी जाती हैं, तो भी निर्देशिका ओवरहेड उच्च स्तर पर बनी रहती है, इससे पहले कि यह चरण हटाए गए थे ..

मैंने रिबूट करने की कोशिश नहीं की है, यह देखने के लिए कि क्या यह पलटता है, लेकिन या तो मामले में, इसका मतलब यह है कि निर्देशिका का आकार ऐतिहासिक परिस्थितियों के आधार पर भिन्न होता है।

कुल फ़ाइल आकार के सटीक मान के लिए प्रत्येक फ़ाइल आकार का मिलान सबसे अच्छा विकल्प हो सकता है ।

निम्न स्क्रिप्ट सभी फ़ाइल आकार (बाइट्स में) का योग करती है।

ओएस एक्स के लिए, यदि आपके पास -b'डु' के लिए ऑप्टोन नहीं है, तो आप statइसके बजाय उपयोग कर सकते हैं । (यदि आपके पास है:) ... टिप्पणी लाइन उबंटू के statविकल्प को दिखाती है 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
गिल्स एसओ- बुराई को रोकें '

ओएस एक्स पर MacPorts के साथ आप स्थापित कर सकते हैं coreutilsकी जीएनयू संस्करण प्राप्त करने के duरूप में gdu। तो यह बिल्कुल पोर्टेबल नहीं है , लेकिन ओएस एक्स पर लोगों के लिए उपयोगी हो सकता है कि वे कुछ मुख्य बर्तनों के जीएनयू संस्करण प्राप्त कर सकें।
ड्रफ्रोप्लास्पैट

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। अल्पाइन छवि
कार्टेलैट
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.