`Mkdir -p` के लिए तर्क सूची बनाने के लिए पैरामीटर विस्तार का उपयोग करना


10

मेरे पास कुछ इस तरह है:

% ls -1dF /tmp/foo/*
/tmp/foo/000f9e956feab3ee4625aebb65ae7bae9533cdbc/
/tmp/foo/002e34c2218f2c86fefd2876f0e5c2559c5fb3c4/
/tmp/foo/00b483576791bab751e6cb7ee0a7143af43a8069/
.
.
.
/tmp/foo/fedd0f7b545e7ae9600142656756456bc16874d3/
/tmp/foo/ff51ac87609012137cfcb02f36624f81cdc10788/
/tmp/foo/ff8b983a7411395344cad64182cb17e7cdefa55e/

मैं barप्रत्येक उपनिर्देशिका के तहत एक निर्देशिका बनाना चाहता हूँ foo

अगर मैं इसके साथ करने की कोशिश करता हूं

% mkdir -p /tmp/foo/*/bar

... मुझे त्रुटि मिलती है

zsh: no matches found: /tmp/foo/*/bar

(अड़चन में, मैं त्रुटि का कारण समझ सकता हूं।)

मुझे पता है कि मैं एक लूप के साथ मूल समस्या को हल कर सकता हूं, लेकिन मैं यह जानने के लिए उत्सुक हूं zshकि क्या पैरामीटर विस्तार के कुछ प्रकार का समर्थन करता है जो एकल आह्वान के लिए वांछित तर्क का उत्पादन करेगा mkdir -p। IOW, " /barविस्तार से उत्पन्न हर उपसर्ग के लिए अपील" के बराबर एक पैरामीटर विस्तार /tmp/foo/*, जिसके परिणामस्वरूप

% mkdir -p /tmp/foo/000f9e956feab3ee4625aebb65ae7bae9533cdbc/bar ... /tmp/foo/ff8b983a7411395344cad64182cb17e7cdefa55e/bar

जवाबों:


13
setopt histsubstpattern extendedglob
mkdir -p /tmp/foo/*(#q/:s_%_/bar_)

यह ग्लोबिंग बढ़ाया गया है जिसमें एक qउबटा हुआ गोलाकार झंडा है जो केवल निर्देशिकाओं और एक संशोधक से मिलान करने के लिए एक ग्लोब क्वालिफायर का उपयोग करता है ( एक पैटर्न चरित्र का उपयोग करता है जो केवल इतिहास प्रतिस्थापन पैटर्न मोड में उपलब्ध है) जो प्रत्येक शब्द के लिए एक स्ट्रिंग को जोड़ता है।s%

man zshexpn

वाह, मैं प्रभावित हूं। मुझे भी यह सब आपके द्वारा निर्दिष्ट मैन पेज में मिला।
वाइल्डकार्ड

1
ध्यान दें कि मूल पोस्टर निर्दिष्ट किया गया है mkdir -p, जो कि कुछ निर्देशिकाओं के पहले से ही barनिष्क्रिय हो जाने पर त्रुटियों को न फेंकने के आपके आदेश से थोड़ा अलग प्रभाव होगा । मामूली बिंदु लेकिन यहाँ ध्यान देने योग्य है। :)
वाइल्डकार्ड

1
एक और तरीका है करने के लिए के माध्यम से उपयोग सरणी विस्तार है ${^spec}और संलग्न barप्रत्येक तत्व जो कुछ के लिए /tmp/foo/*(/)करने के लिए फैलता है: set -- /tmp/foo/*(/)तोmkdir -p -- "${^@}/bar"
don_crissti

5

ज़रूर - एक लूप का उपयोग करें

for n in /tmp/foo/*; do mkdir "$n/bar";done

ग्लब्स का उपयोग मौजूदा वस्तुओं की सूची का विस्तार करने के लिए किया जाता है , न कि उन चीजों के लिए जो अभी तक बनाई नहीं गई हैं।


क्षमा करें, मुझे डर है कि मेरा प्रश्न स्पष्ट रूप से नहीं कहा गया था। मैं इसे स्पष्ट करूंगा।
kjo

2
यह जवाब नहीं देता है कि zshक्या ग्लोब का विस्तार किया जा सकता है और एक ही वाक्य रचना के साथ पाठ को जोड़ सकता है - लेकिन मुझे लगता है कि यह केवल वही तरीका है जो आप चाहते हैं, @kjo।
वाइल्डकार्ड

4

यदि निर्देशिका एक सरणी में हैं, तो आप ${^...}विस्तार के रूप का उपयोग कर सकते हैं ।

a=(/tmp/foo/*/)
mkdir -p ${^a}bar

0

आप इसका उपयोग कर सकते हैं findऔर कर सकते हैं xargs:

find /tmp/foo -maxdepth 1 -mindepth 1 -type d | xargs -i echo mkdir -p {}/bar

जो लक्ष्य के उपनिर्देशिकाओं में और अपने आप में क्रमशः सृजन -maxdepth 1और उपयोग -mindepth 1को रोकता है। यह केवल निर्देशिकाओं पर विचार करता है।bar/tmp/footype d

आपको echoवास्तविक कार्यों को करने के लिए निकालना echoहोगा , अन्यथा निष्पादित करने के लिए केवल लाइनें प्रिंट होंगी। आप इसे प्रतिस्थापन में भी संलग्न कर सकते हैं जैसे $()इसे निष्पादित करना।

मैनुअल कहते हैं xargs -i, पदावनत किया गया है, लेकिन मुझे कोई अन्य समान रूप से आसान विकल्प नहीं मिला, इसलिए इसे अभी भी कुछ वर्षों तक काम करना चाहिए ... आप इसके -iसाथ -I'{}'अप-टू-डेट हो सकते हैं।


यह जवाब और अगला मुझे अच्छा लग रहा है। क्या कोई समझा सकता है कि उन्हें वोट क्यों दिया जाना चाहिए? डाउन वोट ठीक हैं, लेकिन अगर कोई कारण नहीं दिया जाता है तो हम कैसे सीख सकते हैं?
जो

यह कुछ भी नहीं बल्कि ओपी से पूछा गया एक काम करने वाला विकल्प है। मुझे पता नहीं।
लोआ_िन_

मुझे लगता है कि यह किसी तरह का पूर्वाग्रह है कि जवाबों का उन पर बुरा जवाब होना चाहिए, इसलिए पूर्वाग्रह ने इसे मेरी प्रतिष्ठा पर टोल लिया।
loa_in_

मुझे अस्पष्टीकृत वोट पसंद नहीं है, लेकिन मैंने ऐसा कोई पूर्वाग्रह नहीं देखा है। आमतौर पर, "बुरे" उत्तर (जिन्हें मैं समझता हूं) वास्तव में खराब हैं।
जो

0

@loa_in_ के पास इसका अधिकांश हिस्सा था, लेकिन पाइपिंग findआउटपुट में फॉक्स पेस होता है।

find /tmp/foo -maxdepth 1 -mindepth 1 -type d -exec mkdir {}/bar \;

मैं सिर्फ xargsविभिन्न उपकरणों के साथ उपयोग करता हूं, जिनका -execविकल्प नहीं है , इसलिए मैं अपने दृष्टिकोण का उपयोग करता हूं क्योंकि यह उन सभी के साथ समान रूप से काम करता है।
loa_in_
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.