2011-01-14 18 views
21

मैं, आदेश पंक्ति परबाश को वैरिएबल में वाइल्डकार्ड का विस्तार कैसे करें?

mv ./images/*.{pdf,eps,jpg,svg} ./images/junk/ 

टाइपिंग एक bash स्क्रिप्ट अंदर से रूप में एक ही प्रभाव को प्राप्त कोशिश कर रहा हूँ। मेरे पास है:

MYDIR="./images" 
OTHERDIR="./images/junk" 
SUFFIXES='{pdf,eps,jpg,svg}' 
mv "$MYDIR/"*.$SUFFIXES "$OTHERDIR/" 

, जो जब चलाने के लिए, नहीं अनपेक्षित त्रुटि देता है:

mv: rename ./images/*.{pdf,eps,jpg,svg} to ./images/junk/*.{pdf,eps,jpg,svg}: 
No such file or directory 

यह सब उद्धृत करने के लिए सही तरीका क्या है ताकि mv वांछित विस्तार करना वास्तव में होगा? (हाँ, वहाँ फ़ाइलों को ./images/ में प्रतिमान से मेल खाने के बहुत सारे हैं।)

उत्तर

22

एक हटाया गया उत्तर सही रास्ते पर था। आपके प्रयास करने के लिए एक मामूली संशोधन:

shopt -s extglob 
MYDIR="./images" 
OTHERDIR="./images/junk" 
SUFFIXES='@(pdf|eps|jpg|svg)' 
mv "$MYDIR/"*.$SUFFIXES "$OTHERDIR/" 

ब्रेस विस्तार चर विस्तार से पहले किया जाता है, लेकिन चर विस्तार पथ विस्तार से पहले किया जाता है। तो ब्रेसिज़ तब भी ब्रेसिज़ होते हैं जब चर आपके मूल में विस्तारित होता है, लेकिन जब चर के बजाय पथनाम तत्व होते हैं, तो पथनाम विस्तार होने पर उन्हें पहले ही विस्तारित किया जा चुका है। चेतावनियों के लिए

+3

+1, साफ चाल, '@()' के बारे में नहीं पता था, मैंने कुछ नया सीखा है। बस इसे मैनपेज में देखा, किसी के लिए सोच रहा है कि '?() 'पैटर्न,' *() 'पैटर्न,' +() 'पैटर्न,' @() 'पैटर्न, और'!() 'पैटर्न हैं। सभी उपलब्ध हैं अगर 'extglob' सक्षम है। – falstro

+0

शानदार, धन्यवाद! खोल स्क्रिप्ट में उद्धरण और विस्तार हमेशा मुझे समस्याएं पैदा करता है, इससे बहुत मदद मिलेगी। –

+1

@RossDuncan, मैं सुझाव देता हूं कि http://mywiki.wooledge.org/BashParser शैल के निष्पादन मॉडल में शामिल चरणों पर एक अच्छा संदर्भ शुरू करने के लिए एक जगह के रूप में और वे किस क्रम में होते हैं। –

5

आप क्रम में है कि रेखा eval करने के लिए यह काम करने के लिए के लिए बहुत की तरह, की आवश्यकता होगी:

MYDIR="./images" 
OTHERDIR="./images/junk" 
SUFFIXES='{pdf,eps,jpg,svg}' 
eval "mv \"$MYDIR\"/*.$SUFFIXES \"$OTHERDIR/\"" 

अब, यह समस्या है , विशेष रूप से, यदि आप $SUFFIXES पर भरोसा नहीं करते हैं, तो इसमें इंजेक्शन आक्रमण हो सकता है, लेकिन इस साधारण मामले के लिए यह ठीक होना चाहिए।

यदि आप अन्य समाधानों के लिए खुले हैं, तो आप find और xargs के साथ प्रयोग करना चाहेंगे।

+1

+1। 'eval' बुरा है। – l0b0