मैं सभी उपनिर्देशिकाओं में निर्देशिका कैसे बनाऊं?


34

मान लीजिए कि मेरे पास इस तरह की एक निर्देशिका संरचना है:

$ [~ / अभ्यास] एल.एस.
ऐ बी सी डी/

अब मैं tmp1सभी उप निर्देशिकाओं में एक निर्देशिका बनाना चाहता हूं practiceऔर मैं यह करता हूं:

$ [~ / अभ्यास] mkdir * / tmp1
mkdir: निर्देशिका नहीं बना सकता `* / tmp1 ': ऐसी कोई फ़ाइल या निर्देशिका नहीं

तब मैं -pस्विच की कोशिश करता हूं और मैं एक निर्देशिका के *साथ उप निर्देशिका के साथ एंडअप करता हूंtmp1

$ [~ / अभ्यास] mkdir -p * / tmp1

$ [~ / अभ्यास] एल.एस.
*/ ऐ बी सी डी/

मुझे पता है कि -pस्विच का उपयोग कई गैर-प्रासंगिक निर्देशिकाओं को बनाने के लिए है। मुझे लगा कि यह मदद कर सकता है।

मैं tmp1एक बार में सभी उपनिर्देशिकाओं में कैसे बनाऊं ?

यह किया जा सकता है, मैं इसे कैसे बनाने के लिए विस्तार है \tmp1, \tmp2, \tmp3में \a, \bऔर \cएक ही बार में?

संपादित करें: मैं उल्लेख है कि निर्देशिका सरल और क्रम में हो सकता है, की तरह नहीं है याद किया a, b, cआदि, और निर्देशिका बनाया जाना जरूरी की तरह नहीं है tmp1, tmp2

$ [~ / अभ्यास] एल.एस.
कुत्ता / बिल्ली / चूहा /

उन में, मैं कुछ पसंद करना चाहूंगा

$ [~ / अभ्यास] ls *
कुत्ता:
लाल नीला/

बिल्ली:
लाल नीला/

चूहा:
लाल नीला/

1
क्रिस्टोफर के जवाब को देखते हुए , आपको यह स्पष्ट करना चाहिए कि क्या "create \ tmp1, \ tmp2, \ tmp3 in \ a, \ b और \ c" को कुल 3 या 9 उपनिर्देशिकाएँ मिलनी चाहिए।
manatwork

@manatwork: यह एक अच्छी बात है। इसे 9 उपनिर्देशिकाएँ बनाने चाहिए।
अनिमेष

निर्देशिका सूडो खोज के नाम पर अंतरिक्ष मुद्दे को हल करने के लिए यह मेरी सहायता है। / -depth -type d -exec echo '"" {} / RCS "' \;

जवाबों:


44

ग्लब्स के साथ :

for dir in */; do mkdir -- "$dir/tmp1"; done

ध्यान दें

  • मैं */ग्लोब के रूप में उपयोग करने की थोड़ी सी हैक के साथ केवल डायर (सिम्बलिंक से डायर तक) का इलाज करता हूं
  • यदि आप एक साथ कई सबडिरेस बनाना चाहते हैं:

    for dir in */; do mkdir -- "$dir"/{tmp1,foo,bar,qux}; done


क्या मैं for i in */; do mkdir "$i/itemone" "$i/itemtwo"; doneकई, क्रमबद्ध निर्देशिका नामों के लिए कर सकता हूं ?
अनिमेष

मैंने इसका परीक्षण किया और यह बहुत संभव है। धन्यवाद।
अनिमेष

मेरी संपादित पोस्ट देखें
गिल्स केनॉट

1
ब्रेस का विस्तार उद्धृत स्ट्रिंग में नहीं किया जाता है।
manatwork

हाँ, धन्यवाद, स्टीफन चेज़ेलस द्वारा संपादित पोस्ट तदनुसार ...
गाइल्स क्वेनोट


10

GNU या BSD के साथ * खोजें:

find -mindepth 1 -maxdepth 1 -type d -exec mkdir {}/newdir \;

या पैरामीटर विस्तार का उपयोग कर:

dirs=(*/)
mkdir -- "${dirs[@]/%/newdir}"

* शामिल है एक्स एक्स


2
स्टैंडर्ड find . -name . -o -prune -type d -exec sh -c 'exec mkdir "$1/newdir"' sh {} \;
फाइंड

1
दो समाधानों के बीच के अंतरों पर भी ध्यान दें: पहले वाले में छिपी हुई निर्देशिकाएँ शामिल हैं, दूसरा जो वर्तमान निर्देशिका में किसी भी सिम्लिंक द्वारा लिंक की गई निर्देशिकाओं में एक नया जोड़ देगा।
स्टीफन चेज़लस

6

विषय के बाद से आप उल्लेख कर रहे हैं bash, लेकिन रिकॉर्ड के लिए, zsh के साथ, आप करेंगे:

dirs=(*(/))
mkdir -- $^dirs/tmp1

$^varसरणी के विस्तार के लिए ब्रेस-जैसे विस्तार चालू करता है । यह की याद ताजा करती है rcके ^ऑपरेटर और में rc(या उसके व्युत्पन्न es), आप लिखते हैं:

dirs=(*/)
mkdir -- $dirs^tmp1

हालाँकि ध्यान दें (और वही यहाँ दिए गए bash समाधानों पर लागू होता है) कि rc समाधान में dirsनिर्देशिकाओं के प्रतीकात्मक लिंक भी शामिल होंगे। Zsh समाधान में, परिवर्तन *(/)करने के लिए *(-/)अगर आप चाहते हैं निर्देशिका के लिए सिमलिंक शामिल करने के लिए।


सिंलिंक के बारे में अपनी बात के लिए +1! यह व्यवहार वांछित हो सकता है, लेकिन नकली निर्देशिका बनाने के बारे में mkdir की शिकायत को -pझंडे के साथ दबाया जा सकता है ।
कोजिरो

4

मूल रूप से, मूल निर्देशिका पर लूप:

for d in */; do mkdir "$d/red" "$d/blue"; done

जोड़े --के बाद mkdirयदि आप निर्देशिका जिसका नाम के साथ शुरू होता हो सकता है -

Zsh में, आप इसे e ग्लोब क्वालिफायर के साथ एकल कमांड में कर सकते हैं :

mkdir *(/e\''REPLY=($REPLY/{red,blue})'\')

लेकिन यह दो कमांड के रूप में टाइप करने के लिए तेज है:

d=(*(/)); mkdir $^d/{red,blue}

1
एक साइट पर जिसे एक संदर्भ के रूप में जाना जाता है, मैं इसके बजाय "कहना चाहता हूं mkdir -- whatever, और यदि आप कमांड के विकल्प के रूप में संभवतः जो भी लिया जाना चाहते हैं, उसके विस्तार के लिए इरादा छोड़ -- दें ।" यहां कोई बात नहीं है। यह ओपी के मामले में एक समस्या नहीं हो सकती है, लेकिन सामान्य मामलों में यह एक है। मुझे लगता है कि हमारा कर्तव्य है कि हम यहां सही और सुरक्षित वाक्यविन्यास सिखाएं। mkdir--
स्टीफन चेजलस

@StephaneChazelas एक पटकथा के संदर्भ में, मैंने हमेशा सभी आवश्यक --और उद्धरण और बड़ी वसा चेतावनी दी है जब newlines समर्थित नहीं हैं। कमांड लाइन के संदर्भ में, मैं त्वरित संस्करण दिखाना पसंद करता हूं जो पहले अभ्यास में काम करता है, और बुलेटप्रूफ संस्करण पूरक के रूप में।
गिलेस एसओ- बुराई को रोकना '


1

गैर-निर्देशिका फ़ाइलों से बचने वाले स्पुतनिक के उत्तर पर भिन्नता:

for x in *; do if [ -d "$x" ]; then mkdir "$x/tmp1"; fi; done

मैं केवल dirs का इलाज करता हूं, यह सब जादू है ...
गिलेस केनॉट

शांत, मिल गया;)
सुनहरी जुलाहे

2
ऐसा नहीं होना चाहिए if [ -d "$x" ];…?
कोजीरो

हाँ। मैं व्यावहारिक रूप से फ़ाइल नाम में कभी भी रिक्त स्थान नहीं
रखता हूं

1

यह पुराने यूनिक्स मास्टर्स (फ्रीबीएसडी 10.1 पर परीक्षण किया गया) से एक अच्छा है यदि आप संस्करण नियंत्रण चाहते हैं (आरसीएस चेक इन लॉक के साथ: ci -l एक संक्षिप्त टिप्पणी के साथ ही: प्रारंभिक रिलीज के लिए) आपकी / etc / * कॉन्फ़िगर फ़ाइलें पर ~ / .यह / आदि

sudo rsync -av /etc/ ~/.his
sudo find -d ~/.his/etc -type d -exec echo '{}/RCS' \; | xargs sudo mkdir -p
sudo find -d ~/.his/etc \! -name "RCS" | xargs sudo ci -l -mir -t-ir

मैं यह देखने में विफल रहता हूं कि यह ओपी
आर्कमेयर

1

होना चाहिए \! नाम "आरसीएस" और यह पहले चेक इन में सबसे अच्छा काम करता है।

सुडोल ~ / .his / etc \! -name "RCS" -ls

sudo find -d ~ / .his / etc \! -नाम "आरसीएस" | xargs sudo ci -l -mir -t-ir

यह पिछले एक भी फ़ाइल नाम पर सभी आरसीएस सामग्री को छानने में भाग के लिए बहुत अच्छी तरह से काम करता है:

sudo find -d ~ / .his / etc -type f | grep -v आरसीएस | xargs sudo ci -l -mir -t-ir


1

यह मेरे लिए एक बड़ी मदद है। मुझे कई फ़ोल्डर में उपनिर्देशिका का एक सेट बनाने की आवश्यकता थी और कुछ इस तरह से:

!/bin/sh

cd /dest/cont

for dir in */*/; do
    mkdir -p -- $dir/{FB,Video,Audio,proj};
done

जब एक सफेद जगह का सामना करना पड़ता है, तो छोड़कर महान काम किया। क्या */*/तर्कों के हिस्से में रिक्त स्थान को अनदेखा करने का एक तरीका है ?

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