मुझे लूप का उपयोग करने की आवश्यकता नहीं थी, केवल स्टेट और अजीब के कुछ सावधानीपूर्वक आवेदन। विवरण और नीचे विवरण, पहले कोड:
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 तक, जो उन्हें आरएम चलाता है।
मुझे लगता है कि यह स्क्रिप्ट एक अच्छी शुरुआत है, लेकिन यह वास्तव में सवाल का जवाब नहीं देती है। आपने फ़ाइलों को क्रम में हटाने के लिए कहा ताकि निर्देशिका का आकार दहलीज के नीचे आता है। यहां आपका उत्तर वास्तव में कुछ भी हटाने के लिए प्रतीत नहीं होता है, यह सिर्फ उनके माध्यम से फ़ाइलों और लूप को टाइप करता है। ऐसा लगता है कि आप कहीं यहां "आरएम" खो रहे हैं। –