मैं dir1 बनाने की कोशिश करने के लिए mkdir को कैसे बताऊं, और अगर यह पहले से मौजूद है dir2, आदि, जब तक यह एक नाम को हिट नहीं करता है जो मौजूद नहीं है?


13

मैं अंत में एक संख्या के साथ एक निर्देशिका बनाना चाहता हूं, "dir1", और उस संख्या को बढ़ाता हूं यदि निर्देशिका पहले से मौजूद है जब तक कि वह निर्देशिका नाम को हिट नहीं करता है जो मौजूद नहीं है, और मुझे इसे एक ही पंक्ति में करने की आवश्यकता है लिनक्स कमांड लाइन, कुछ इस प्रकार है:

mkdir --increment dir$

मुझसे यह कैसे होगा?

अब तक मुझे यह मिला है:

dir=output; n=0; mkdir -p $dir$n; if test -d $dir$n; then n=$((n+1)); echo $dir$n; fi

लेकिन यह सिर्फ अगले डीर नाम को इको करता है, मुझे इसे कमांड को फिर से निष्पादित करने की आवश्यकता है।

जवाबों:


26

यह एक तुच्छ अभ्यास है while:

n = 0
जबकि ! mkdir dir $ n
कर
    एन = $ ((n + 1))
किया हुआ

लेकिन निश्चित रूप से यह महसूस करने में ज्यादा समय नहीं लगता कि यह तुच्छ व्यवस्था अच्छी तरह से पैमाना नहीं है।

इसलिए पहिया को फिर से मजबूत करने और सभी कोनों को फिर से दाढ़ी बनाने के बजाय, एक अलग से एक टेम्पलेट से अद्वितीय अस्थायी निर्देशिकाएं बनाता है:

नाम = $ (mktemp -d dirXXXXXXXXXXX)


संख्या पर द्विआधारी खोज काफी अच्छा हो सकता है।
थोरबजोरन राव एंडरसन

जहां आप पहिया सुदृढीकरण प्रक्रिया शुरू कर रहे हैं, वहां से काफी कम कोनों को बंद किया जा रहा है, जिनमें से कम से कम सुरक्षा और समानता पर विचार करते हुए फाइलसिस्टम को याद नहीं कर रहे हैं।
JdeBP

6

यदि आप केवल सही क्रम में सूचीबद्ध निर्देशिकाओं को बढ़ाना चाहते हैं, तो क्या मैं इसके बजाय वर्तमान तिथि के आधार पर नामित फ़ोल्डरों की सिफारिश कर सकता हूं?

DATE=$(date +%F)
mkdir "dir-$DATE"

यह dir-2014-03-02( जैसे YYYY-MM-DD, ताकि वर्णमाला क्रम में प्रकट होने के लिए) नामों के साथ निर्देशिकाएं बनाएगा ।

यदि आप प्रति दिन एक से अधिक निर्देशिका बनाते हैं, तो आप वर्तमान समय को फ़ाइल नाम में जोड़ सकते हैं। man dateआउटपुट स्वरूपण को ट्वीक करने का तरीका देखें date


5

पहले "सबसे बड़ा" नाम ढूंढें, संख्या और वेतन वृद्धि प्राप्त करें:

last_dir=(printf "%s\n" dir* | sort -Vr | head -1)
num=$(last_dir#dir)
mkdir "dir$((num+1))"

यह एक अच्छा विचार है, लेकिन इसे लंबित करना आसान नहीं है।
थोरबजोरन रावन एंडरसन

जब तक लाखों निर्देशिकाएं नहीं होती हैं, तब तक समानांतरकरण निश्चित रूप से समयपूर्व अनुकूलन है।
ग्लेन जैकमैन

आपको printfयहाँ की आवश्यकता क्यों होगी ? साधारण echoकाम नहीं होगा ?
रसलान

इसके अलावा, मैं इसके dir[0-9]*बजाय का उपयोग करेंगे dir*
रसलान

1
आप गलत समझ गए। मैं इस बारे में बात करता हूं कि क्या स्क्रिप्ट एक साथ कई बार चलने के लिए समझदार है (कई धागे, कई उपयोगकर्ता आदि) या नहीं।
थोरबजोरन रावन एंडरसन

2

मान लें कि आपकी निर्देशिका हमेशा "dir1" पर शुरू होती है, और यह कि $ dir * नामक कोई फाइल नहीं है (iE वे सभी क्रमिक रूप से क्रमांकित निर्देशिकाएं हैं), आप इस एक लाइनर से दूर हो सकते हैं -

mkdir ${dir}$(( `ls ${dir}* | wc -w` + 1 ))

यह $ dir से शुरू होने वाली फाइलों की संख्या को गिनाता है, फिर उस संख्या में एक जोड़ देता है और एक नई फ़ाइल बनाता है।


0

अन्य उत्तरों के लिए परिशिष्ट: यदि आपको नाम के अनुसार सही ढंग से छांटने की आवश्यकता है, तो आप एक निश्चित लंबाई के साथ नए शून्य संख्या (NUM) को अग्रणी शून्य के साथ पैड करना चाह सकते हैं।

निम्नलिखित को एक पंक्ति में संघनित किया जा सकता है या अन्य समाधानों में से एक में एम्बेड किया जा सकता है।

NUM="00"$NUM                  ## Left zero pad with fixed length - 1 zeros 
NUM=${NUM:((${#NUM} - 3)):3}  ## left trim to fixed length (3 in this case)

यह मानता है कि NUM कम से कम 1 अंक लंबा है और निर्धारित लंबाई से अधिक नहीं होगा। अपनी आवश्यकताओं के अनुसार समायोजित करें।

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