निर्देशिका को सबसे बड़े सूचकांक के साथ कैसे प्राप्त करें और शेष निर्देशिकाओं को समाप्त करें?


2

मेरे पास एक ऐसी प्रक्रिया है जो क्रमिक रूप से निर्देशिकाएं बनाती है, उनके लिए आरोही क्रम में एक सूचकांक प्रदान करती है, और अंतिम-पुनरावृत्ति निर्देशिका में परिणामों को संग्रहीत करती है, सबसे बड़ा सूचकांक। यह देखते हुए कि प्रक्रिया को पूरा करने के लिए आवश्यक पुनरावृत्तियों की संख्या प्रति डेटा सेट में भिन्न होती है, मैं अंतिम निर्देशिका के सूचकांक की भविष्यवाणी नहीं कर सकता। उदाहरण के लिए:

#Dataset 1 may produce
ls -d Dir*
...    Dir4    Dir5

तथा

#Dataset 2 may produce
ls -d Dir*
...    Dir34    Dir35

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

ARR=($(ls -d Dir*))
cp ${ARR[@]:(-1)} LastDirectory #Preserve my results in LastDirectory
rm Dir*

लेकिन यह निश्चित रूप से पैर में खुद को गोली मारने का एक तरीका है। मान लीजिए कि कार्यक्रम को समाप्त करने के लिए दस पुनरावृत्तियों लगते हैं। फिर, Dir10 में मेरे परिणाम होंगे। अगर मैं निर्देशिकाओं को सूचीबद्ध करता हूं और उन्हें सरणी में पास करता हूं, तो Dir10 अंतिम स्थिति में नहीं होगा और इसे समाप्त कर दिया जाएगा। यह उस तरह का अप्रत्याशित व्यवहार है जिससे मैं बचना चाहता हूँ!

#You can copy-paste this piece of code to replicate the problem:
mkdir Dir1 Dir2 Dir3 Dir4 Dir5 Dir6 Dir7 Dir8 Dir9 Dir10 
ls -d Dir*
Dir1 Dir10 Dir2 Dir3 Dir4 ... Dir8 Dir9
ARR=($(ls -d Dir*))
echo ${ARR[@]:(-1)}
Dir9

वहाँ सबसे बड़ी सूचकांक के साथ छोड़कर सभी निर्देशिकाओं से छुटकारा पाने का एक तरीका है?

नोट: मैंने निर्देशिका निर्माण तिथियों का उपयोग करने के बारे में सोचा था, लेकिन ऐसा लगता है कि यह विकल्प लिनक्स में समर्थित नहीं है।


कृपया सूचकांक 9 और 10. के लिए एक उदाहरण जोड़ें
— अर्जन

और आपके प्रश्न से असंबंधित, आप नामों के बजाय निर्माण समय का उपयोग करने में सक्षम हो सकते हैं।
— अर्जन

@ अर्जन I में उदाहरण शामिल है
— je_b

@ अर्जन जहाँ तक मुझे पता है, लिनक्स निर्माण की तारीखों का समर्थन नहीं करता है: unix.com/shell-programming-and-scripting/…
— je_b

सच, @ जे_ बी, संशोधन की तारीख तब; का उत्पादन ls -t।
— अर्जन

जवाबों:


4

मेरे उबंटू पर -vविकल्प है ls। से man ls:

पाठ के भीतर (संस्करण) संख्या के -v प्राकृतिक प्रकार

एक विकल्प के रूप -Vविकल्प को sortभी संस्करण संख्या के साथ सौदा करने के लिए है। मैंने इसे अपने उत्तर में शामिल करने का फैसला किया क्योंकि sortफ़िल्टर के रूप में काम करता है। यह सामान्य स्थिति में आसान हो सकता है (जैसे जब आप अपनी निर्देशिका सूची findकिसी पाठ फ़ाइल से या उससे प्राप्त करते हैं )।

अपनी सरणी परिभाषा इस प्रकार लिखें:

ARR=($(ls -d -v Dir*))

या यह:

ARR=($(ls -d Dir* | sort -V))

संपादित करें: dave_thompson_085 की टिप्पणी उपयोगी सरलीकरण देती है:

-rया तो जोड़ने के लिए वांछित आइटम पहले डालता है, अधिक सुविधाजनक के साथ सुलभ ${ARR[1]}।


1
वे दोनों जीएनयू कोर्यूटिल्स की विशेषताएं हैं जो वास्तव में अजीब तरह के डिस्ट्रोस या लिनक्स का निर्माण करेंगे। और -rया तो जोड़ने के लिए वांछित आइटम पहले, सुलभ के साथ और अधिक सुविधाजनक${ARR[1]}
— dave_thompson_085

0

आप (स्वयं) नाम की एक निर्देशिका बना सकते हैं Dir1000 इससे पहले कि आप इस प्रक्रिया को शुरू, और फिर इसे बनाता है Dir1001, Dir1002आदि?
यदि प्रक्रिया उस तरह से काम करती है, तो यह स्पष्ट और आसान होगा?


नहीं, मैं नहीं कर सकता। मैंने आपके विकल्प का परीक्षण किया और सिस्टम केवल मैन्युअल रूप से बनाई गई निर्देशिका को अनदेखा करता है। ऐसा लगता है कि स्क्रिप्ट का अपना आंतरिक काउंटर है। एक साइड नोट के रूप में, यह वह कोड है जो मुझे एक सहकर्मी से उस भाषा में विरासत में मिला है जिसे मैं मुश्किल से समझता हूं। मैं स्पर्श करना पसंद करता हूं जो पहले से ही काम कर रहा है और समस्या को व्यावहारिक रूप से हल करता है।
— je_b

0

चूंकि आप उस प्रोग्राम को नहीं बदल सकते हैं जो निर्देशिका बनाता है, जैसा कि आपने उल्लेख किया है, क्या आप इसे प्रत्येक कार्य के लिए अलग-अलग आउटपुट निर्देशिकाओं में लिख सकते हैं? तो आपके पास होता

Task1
+ Dir1
+ Dir2
Task2
+ Dir3
+ Dir4

अन्यथा, यह संभवतः निर्देशिकाओं की सामग्री को देखने के लिए सुरक्षित है । क्या मध्यवर्ती निर्देशिकाओं और अंतिम एक के बीच अंतर हैं जिनमें परिणाम शामिल हैं? यदि परिणाम केवल अंतिम निर्देशिका में हैं, तो आप इस जानकारी का उपयोग यह पता लगाने के लिए कर सकते हैं कि परिणामों को कॉपी करना और अन्य निर्देशिकाओं को निकालना क्या है।


0

करता sortहै -n -rऔर -kविकल्प? यदि ऐसा होता है, तो उपयोग करें:

ARR=($( ls -d Dir* | sort -rn -k1.4 ))

परिणाम का परीक्षण करने के लिए, उपयोग करें:

mkdir Dir1 Dir2 Dir3 Dir4 Dir5 Dir6 Dir7 Dir8 Dir9 Dir10 Dir20 Dir100
ARR=($( ls -d Dir* | sort -rn -k1.4 ))
echo ${ARR[@]}

परिणाम होना चाहिए:

Dir100 Dir20 Dir10 Dir9 Dir8 Dir7 Dir6 Dir5 Dir4 Dir3 Dir2 Dir1

निर्देशिका को सबसे बड़े सूचकांक के साथ बचाने के लिए और उनमें से बाकी को हटा दें (यह LastDirectoryमौजूद नहीं है), उपयोग करें:

mv ${ARR[0]} LastDirectory # or simply mv $ARR LastDirectory
rm -r Dir* # error if only one Dir* directory, but LastDirectory is preserved

sort -nr -k1.4आदेश का उपयोग करता -kअंतिम वर्ण चौथे चरित्र का उपयोग कर, पहले तीन पात्रों अनदेखी निर्देशिका नाम सॉर्ट करने के लिए विकल्प। -nविकल्प संख्यानुसार सॉर्ट करता है, और -rविकल्प आदेश पराजयों ताकि सबसे बड़ी संख्या पहला है।

मजबूती के बारे में एक नोट, यानी अप्रत्याशित परिस्थितियों को संभालना। समाधान मानता है कि सभी नाम पैटर्न से मेल खाते हैं जहां तीन वर्ण हैं, " Dir", इसके बाद एक नंबर आता है, और LastDirectoryयह मौजूद नहीं है। सामान्य तौर पर, lsकमांड परेशानी है क्योंकि यह नामों को इस तरह से सूचीबद्ध करता है जो पढ़ने में आसान है; लेकिन, उदाहरण के लिए, यदि फ़ाइल नाम में एक एम्बेडेड स्पेस (रिक्त वर्ण) है, तो यह नाम अप्रत्याशित तरीके से इस समाधान को तोड़ देगा।


0

यदि आप दिनांक के अनुसार निर्देशिकाओं को क्रमबद्ध करना ठीक समझते हैं (ऐसा लगता है कि सर्वोच्च सूचकांक वाली निर्देशिका भी हाल ही में बनाई गई है), तो आप यह कर सकते हैं:

ls -1td Dir* | tail -n +2

जो सभी लेकिन सबसे हालिया निर्देशिका को सूचीबद्ध करता है। उन लोगों को हटाने के लिए:

rm $(ls -1td Dir* | tail -n +2)

यहाँ प्रमुख तर्क है -tजो तिथि के अनुसार क्रमबद्ध है।

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