बैश में फ़ोल्डर का आकार जांचें


316

मैं एक स्क्रिप्ट लिखने की कोशिश कर रहा हूं जो एक निर्देशिका आकार की गणना करेगा और यदि आकार 10GB से कम है, और अधिक से अधिक तो 2GB कुछ कार्रवाई करते हैं। मुझे अपने फ़ोल्डर नाम का उल्लेख करने की आवश्यकता कहां है?

# 10GB
SIZE="1074747474"

# check the current size
CHECK="`du /data/sflow_log/`"
if [ "$CHECK" -gt "$SIZE" ]; then
  echo "DONE"
fi

1
और अगर आप इसे क्रमबद्ध करना चाहते हैं: serverfault.com/questions/62411/…
cregox


चूँकि यह एक लोकप्रिय प्रश्न है - यदि कोई भी शुरुआतकर्ता इस प्रश्न के उत्तरों का सामना कर रहा है और इस बारे में अधिक जानना चाहता है कि बिल्ली क्या duहै और हर कोई इन सभी आदेशों को कैसे जानता है: आप man duमैनुअल में डु कमांड देखने के लिए अपने टर्मिनल में टाइप कर सकते हैं । यह एक आउटपुट प्रदर्शित करेगा जिसे आप देख सकते हैं, और सभी झंडे जैसे -h, -c, -s, -b, -b, -apparent-size, आदि का सारांश देंगे जो कि उत्तर दे रहे हैं कि आप उपयोग करने का सुझाव दे रहे हैं। फिर, आप अपने लिए तय कर सकते हैं कि आप duअपने विशिष्ट उपयोग के मामले में किस तरह का उपयोग करना चाहते हैं ।
जोश डेसमंड

जवाबों:


608

तुम कर सकते हो:

du -h your_directory

जो आपको अपनी लक्ष्य निर्देशिका का आकार देगा।

यदि आप एक संक्षिप्त आउटपुट चाहते हैं, du -hcs your_directoryतो अच्छा है।


15
जब आप किसी स्क्रिप्ट के लिए मान प्राप्त करने का प्रयास कर रहे हों तो आप मानव-पठनीय संख्याएँ नहीं चाहते हैं।
धान

4
कोई निर्देशिका पथ निर्दिष्ट नहीं होने से यह वर्तमान कार्यशील निर्देशिका में डिफ़ॉल्ट हो जाएगा। so du -hs== du -hs .
razz

8
यह भी देखें: du | sort -nयह निर्देशिकाओं को इसके आकार के अनुसार क्रमबद्ध कर देगा
ऑप्टिमेयरट्स

3
du -hcs dir_name/*उप-फ़ोल्डर शामिल
optimiertes

du -h <dir> | पूंछ -1?
अलेक्जेंडर मिल्स

143

यदि आप केवल फ़ोल्डर आकार देखना चाहते हैं और उप-फ़ोल्डर नहीं, तो आप उपयोग कर सकते हैं:

du -hs /path/to/directory

अपडेट करें:

आपको पता होना चाहिए कि duप्रयुक्त डिस्क स्थान दिखाता है; और फ़ाइल का आकार नहीं।

यदि आप --apparent-sizeवास्तविक फ़ाइल आकारों का योग देखना चाहते हैं, तो आप इसका उपयोग कर सकते हैं।

--apparent-size
      print  apparent  sizes,  rather  than  disk  usage; although the apparent size is usually smaller, it may be larger due to holes in ('sparse')
      files, internal fragmentation, indirect blocks, and the like

और निश्चित रूप से -hएक स्क्रिप्ट के अंदर (मानव पठनीय) विकल्प के लिए कोई ज़रूरत नहीं है ।

इसके बजाय आप -bस्क्रिप्ट के अंदर आसान तुलना के लिए उपयोग कर सकते हैं ।

लेकिन आपको ध्यान देना चाहिए कि यह अपने आप -bलागू होता --apparent-sizeहै। और यह वह नहीं हो सकता है जिसकी आपको आवश्यकता है।

-b, --bytes
      equivalent to '--apparent-size --block-size=1'

इसलिए मुझे लगता है, आपको उपयोग करना चाहिए --block-sizeया-B

#!/bin/bash
SIZE=$(du -B 1 /path/to/directory | cut -f 1 -d "   ")    
# 2GB = 2147483648 bytes
# 10GB = 10737418240 bytes
if [[ $SIZE -gt 2147483648 && $SIZE -lt 10737418240 ]]; then
    echo 'Condition returned True'
fi

मुझे पता है कि यह कुछ वर्षों का है, लेकिन क्या आप थोड़े से समझाने के लिए दयालु होंगे कि सशर्त में regex और BASH_REMATCH का उद्देश्य क्या है? (या उन वैरिएबल / कमांड / फॉर्मेट के उपयोग के लिए कुछ लिंक प्रदान करने के लिए) मैंने कोड की अपेक्षा की होगी कि फाइल को केवल एक वेरिएबल में फ़ाइल का आकार मिले और तुलना करें कि सीधे 10 जीबी के साथ, वे अन्य चीजें क्या कर रहे हैं?
नॉर्डिको

2
@ नोर्डिको यूप। मुझे regex और BASH_REMATCH की कोई आवश्यकता नहीं थी इसलिए मैंने उत्तर को अपडेट किया।
टैक्सेलो

29

एक सारांश ( -s) और बाइट्स ( -b) का उपयोग करें । आप सारांश के पहले क्षेत्र को काट सकते हैं cut। यह सब एक साथ डालें:

CHECK=$(du -sb /data/sflow_log | cut -f1)

1
मैं शेल स्क्रिप्टिंग में नया हूं। डु कमांड के आउटपुट में डायरेक्टरी नाम शामिल था। मैं केवल संख्या भाग प्राप्त करने में असमर्थ था। आपके जवाब में "कट" ने रहस्य सुलझा दिया!
simpleDev

26

केवल निर्देशिका का आकार प्राप्त करने के लिए, अधिक कुछ नहीं:

du --max-depth=0 ./directory

आउटपुट जैसा दिखता है

5234232       ./directory

5
--max-depthउत्पादन को नियंत्रित करने के लिए बहुत उपयोगी है! उदाहरण के लिए, एक निर्देशिका के अंदर क्या हो रहा है, इसकी अच्छी धारणा पाने के लिए:du -h --max-depth=1
matanster


12

यदि आप केवल फ़ोल्डर का आकार और शायद एमबी या जीबी प्रारूप में देखना चाहते हैं, तो कृपया नीचे दी गई स्क्रिप्ट का प्रयास करें

$du -s --block-size=M /path/to/your/directory/

1
ओएस एक्स पर, झंडे -g1-गिब्ते के लिए और -m1-म्बाइट गिनती के लिए हैं। के माध्यम सेman du
Sgnl

5
# 10GB
SIZE="10"


# check the current size
CHECK="`du -hs /media/662499e1-b699-19ad-57b3-acb127aa5a2b/Aufnahmen`"
CHECK=${CHECK%G*}
echo "Current Foldersize: $CHECK GB"

if (( $(echo "$CHECK > $SIZE" |bc -l) )); then
        echo "Folder is bigger than $SIZE GB"
else
        echo "Folder is smaller than $SIZE GB"
fi

4

यदि यह मदद करता है, तो आप अपने .bashrcया में एक उपनाम भी बना सकते हैं .bash_profile

function dsize()
{
    dir=$(pwd)
    if [ "$1" != "" ]; then
            dir=$1
    fi
    echo $(du -hs $dir)
}

यह वर्तमान निर्देशिका या उस निर्देशिका के आकार को प्रिंट करता है जिसे आपने तर्क के रूप में पारित किया है।


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