मुझे व्यस्त बॉक्स (राउटर) के लिए एक सुरुचिपूर्ण समाधान की आवश्यकता थी, सभी xargs या सरणी समाधान मेरे लिए बेकार थे - ऐसा कोई कमांड उपलब्ध नहीं है। खोज और माइम उचित जवाब नहीं है क्योंकि हम 10 वस्तुओं के बारे में बात कर रहे हैं और जरूरी नहीं कि 10 दिन हों। एस्पो का जवाब सबसे छोटा और सबसे साफ और सबसे अधिक संभावना वाला था।
रिक्त स्थान के साथ त्रुटि और जब कोई फ़ाइल नहीं हटाई जानी है, तो दोनों को बस मानक तरीके से हल किया गया है:
rm "$(ls -td *.tar | awk 'NR>7')" 2>&-
थोड़ा और अधिक शैक्षिक संस्करण: हम यह सब कर सकते हैं यदि हम अलग-अलग awk का उपयोग करते हैं। आम तौर पर, मैं इस पद्धति का उपयोग awk से sh तक (वापसी) चर को पास करने के लिए करता हूं। जैसा कि हम हर समय पढ़ते हैं जो नहीं किया जा सकता है, मैं अलग होने की भीख माँगता हूँ: यहाँ विधि है।
फ़ाइल नाम में रिक्त स्थान के बारे में कोई समस्या नहीं के साथ .tar फ़ाइलों के लिए उदाहरण। परीक्षण करने के लिए, "आरएमएस" को "एलएस" से बदलें।
eval $(ls -td *.tar | awk 'NR>7 { print "rm \"" $0 "\""}')
स्पष्टीकरण:
ls -td *.tarसभी .tar फ़ाइलों को समय के अनुसार क्रमबद्ध करता है। वर्तमान फ़ोल्डर में सभी फ़ाइलों पर लागू करने के लिए, "d * .tar" भाग को हटा दें
awk 'NR>7... पहले 7 लाइनों को छोड़ देता है
print "rm \"" $0 "\"" एक लाइन का निर्माण करता है: rm "फ़ाइल का नाम"
eval इसे निष्पादित करता है
चूंकि हम उपयोग कर रहे हैं rm, इसलिए मैं उपरोक्त कमांड का उपयोग स्क्रिप्ट में नहीं करूंगा! समझदार उपयोग है:
(cd /FolderToDeleteWithin && eval $(ls -td *.tar | awk 'NR>7 { print "rm \"" $0 "\""}'))
ls -tआदेश का उपयोग करने के मामले में इस तरह के मूर्खतापूर्ण उदाहरणों पर कोई नुकसान नहीं होगा: touch 'foo " bar'औरtouch 'hello * world' । ऐसा नहीं है कि हम कभी वास्तविक जीवन में ऐसे नामों के साथ फाइल बनाते हैं!
पक्षीय लेख। यदि हम इस तरह से एक चर को पास करना चाहते हैं, तो हम बस प्रिंट को संशोधित करेंगे (सरल रूप, कोई रिक्त स्थान बर्दाश्त नहीं):
print "VarName="$1
VarNameके मान को चर सेट करने के लिए $1। एक बार में कई चर बनाए जा सकते हैं। यह VarNameएक सामान्य श वेरिएबल बन जाता है और सामान्य रूप से बाद में स्क्रिप्ट या शेल में उपयोग किया जा सकता है। इसलिए, awk के साथ वैरिएबल बनाने और उन्हें शेल में वापस देने के लिए:
eval $(ls -td *.tar | awk 'NR>7 { print "VarName=\""$1"\"" }'); echo "$VarName"