2012-07-23 18 views
5

मैं पहले एक सरल खोज आदेश का इस्तेमाल किया था नष्ट करने के लिए टार पिछले x दिनों में पहुँचा नहीं फ़ाइलें (इस उदाहरण में, 3 दिन) को हटा कर एक निर्देशिका आकार को सीमित करने अब मुझे एक्सेस स्क्रिप्ट के क्रम में हटाकर इस स्क्रिप्ट को सुधारने की जरूरत है और मेरे बैश लेखन कौशल थोड़ा जंगली हैं। यहाँ है कि मैं क्या इसकी जरूरत करना है:बैश स्क्रिप्ट अंतिम अभिगमन फ़ाइलें

  1. जांच एक निर्देशिका/पथ का आकार/to/फ़ाइलें
  2. अगर 1 में आकार) एक्स आकार से अधिक है, का उपयोग तारीख
  3. से फ़ाइलों की एक सूची प्राप्त जब तक आकार एक्स की तुलना में कम

लाभ यहां कैश और बैकअप निर्देशिका के लिए है, मैं सिर्फ क्या मैं एक सीमा के भीतर रखने के लिए की जरूरत है, जबकि सरल पद्धति पर जा सकते हैं नष्ट करेगा है

  • क्रम में फ़ाइलों को हटाने आकार सीमा यदि एक दिन विशेष रूप से बड़ा है। मुझे लगता है कि मुझे लूप के लिए स्टेट और बैश का उपयोग करने की आवश्यकता है?

  • उत्तर

    4

    यहाँ एक सरल, पढ़ सकते हैं और विधि समझने में आसान मैं यह करने के साथ आया है:

    DIRSIZE=$(du -s /PATH/TO/FILES | awk '{print $1}') 
    if [ "$DIRSIZE" -gt "$SOMELIMIT" ] 
        then 
        for f in `ls -rt --time=atime /PATH/TO/FILES/*.tar`; do 
        FILESIZE=`stat -c "%s" $f` 
        FILESIZE=$(($FILESIZE/1024)) 
    
        DIRSIZE=$(($DIRSIZE - $FILESIZE)) 
        if [ "$DIRSIZE" -lt "$LIMITSIZE" ]; then 
         break 
        fi 
    done 
    fi 
    
    +1

    मुझे लगता है कि यह स्क्रिप्ट एक अच्छी शुरुआत है, लेकिन यह वास्तव में सवाल का जवाब नहीं देती है। आपने फ़ाइलों को क्रम में हटाने के लिए कहा ताकि निर्देशिका का आकार दहलीज के नीचे आता है। यहां आपका उत्तर वास्तव में कुछ भी हटाने के लिए प्रतीत नहीं होता है, यह सिर्फ उनके माध्यम से फ़ाइलों और लूप को टाइप करता है। ऐसा लगता है कि आप कहीं यहां "आरएम" खो रहे हैं। –

    1

    मुझे लूप का उपयोग करने की आवश्यकता नहीं थी, केवल स्टेट और अजीब के कुछ सावधानीपूर्वक आवेदन। विवरण और नीचे विवरण, पहले कोड:

    find /PATH/TO/FILES -name '*.tar' -type f \ 
    | sed 's/ /\\ /g' \ 
    | xargs stat -f "%a::%z::%N" \ 
    | sort -r \ 
    | awk ' 
        BEGIN{curSize=0; FS="::"} 
        {curSize += $2} 
        curSize > $X_SIZE{print $3} 
        ' 
    | sed 's/ /\\ /g' \ 
    | xargs rm 
    

    ध्यान दें कि यह एक तार्किक कमांड लाइन है, लेकिन विवेक की खातिर मैं इसे विभाजित अप।

    यह ऊपर दिए गए एक के आधार पर एक खोज कमांड के साथ शुरू होता है, जो उन हिस्सों के बिना होता है जो इसे 3 दिनों से अधिक पुरानी फाइलों तक सीमित करते हैं। यह पाइप करता है कि, फ़ाइल नामों में किसी भी रिक्त स्थान से बचने के लिए रिटर्न मिलते हैं, फिर सभी परिणामों पर स्टेट चलाने के लिए xargs का उपयोग करता है। -f "% a ::% z ::% N" पहले फ़ील्ड में अंतिम पहुंच के समय, दूसरी फ़ाइल में फ़ाइल का आकार, और फ़ाइल का नाम उपयोग करने के लिए प्रारूप को प्रारूप बताता है तीसरा। मैंने फ़ील्ड को अलग करने के लिए '::' का उपयोग किया क्योंकि फ़ाइल नामों में रिक्त स्थान से निपटना आसान है। ऑर्डर करने के बाद क्रमशः पहले फ़ील्ड पर क्रमबद्ध करें।

    अब हमारे पास सबसे पुरानी पहुंच से नवीनतम पहुंच के लिए, हमारी रुचि रखने वाली सभी फ़ाइलों की एक सूची है। फिर अजीब स्क्रिप्ट सूची के माध्यम से सभी आकारों को जोड़ती है, और जब उन्हें $ X_SIZE से अधिक हो जाता है तो उन्हें आउटपुट करना शुरू होता है। फ़ाइलों को इस तरह से आउटपुट नहीं किया जाएगा, अन्य फाइल नाम किसी भी रिक्त स्थान से बचने के लिए फिर से फिर से जाते हैं और फिर xargs तक, जो उन्हें आरएम चलाता है।

    +0

    यह समाधान काम नहीं किया:

    यहाँ एक काम स्क्रिप्ट मैं उपयोग कर रहा हूँ है। मैंने स्क्रिप्ट में सुधार किया और परिणाम को एक अलग उत्तर के रूप में पोस्ट किया। –

    +0

    विचार बहुत अच्छा था। धन्यवाद। –

    6

    मैं brunner314 की मिसाल सुधार हुआ है और यह की समस्याएं ठीक कर।

    #!/bin/bash 
    DELETEDIR="$1" 
    MAXSIZE="$2" 
    if [[ -z "$DELETEDIR" || -z "$MAXSIZE" || "$MAXSIZE" -lt 1 ]]; then 
        echo "usage: $0 [directory] [maxsize in megabytes]" >&2 
        exit 1 
    fi 
    find "$DELETEDIR" -type f -printf "%[email protected]::%p::%s\n" \ 
    | sort -rn \ 
    | awk -v maxbytes="$((1024 * 1024 * $MAXSIZE))" -F "::" ' 
        BEGIN { curSize=0; } 
        { 
        curSize += $3; 
        if (curSize > maxbytes) { print $2; } 
        } 
        ' \ 
        | tac | awk '{printf "%s\0",$0}' | xargs -0 -r rm 
    # delete empty directories 
    find "$DELETEDIR" -mindepth 1 -depth -type d -empty -exec rmdir "{}" \;