2012-10-22 11 views
6

मैं मैं पहली बार अप करने के लिए फ़ाइल नाम के पहले भाग के आधार पर निर्देशिका की एक श्रृंखला बनाने के लिए करना चाहते फ़ाइलोंफ़ाइल नाम से निर्देशिका बनाने और ले जाने के बैश

BR0200.aaa.tsv 
BR0200.bbb.tsv 
BR0200.ccc.tsv 
BR0210.aaa.tsv 
BR0210.bbb.tsv 
BR0210.ccc.tsv 
W0210.aaa.tsv 
W0210.aaa.tsv 
W0210.aaa.tsv 

का भार है '।'

BR0200 
BR210 
W0210 

और उसके बाद सही निर्देशिका के लिए संबद्ध फ़ाइलों को स्थानांतरित (अर्थात् सभी BR0200। * BR0200 निर्देशिका में फ़ाइलें)।

मेरे पास एक बैश स्क्रिप्ट पर एक स्टैब है लेकिन मुझे त्रुटियां मिल रही हैं। कोई भी सलाह कृतज्ञता से ली जाएगी।

#!/bin/bash 

for file in BR* W0*; do 
dir = "${file%%.*}" 
if [-e $dir];then 
mv "$file" "$dir" 
else 
mkdir -p "$dir" 
mv "$file" "$dir" 
fi 
done 

क्षमा करें यदि यह एक मूल प्रश्न है। मैंने वेब पर खोजने की कोशिश की है, लेकिन नतीजतन।

+0

@owlstead आपका क्या मतलब है? –

+0

@owlstead globbing गोले की पेशकश करने वाली सबसे उपयोगी सुविधाओं में से एक है। – jordanm

+0

@jordanm आप निश्चित रूप से टिप्पणी हटा रहे हैं। –

उत्तर

6

किसी असाइनमेंट में = के आसपास कोई व्हाइटस्पेस की अनुमति नहीं है।

dir="${file%%.*}" 

इसके विपरीत, खाली स्थान के एक परीक्षण में आवश्यक है।

if [ -e $dir ]; then 
    ^ ^

जहाँ तक शैलीगत सुधार के रूप में, यह एक अनावश्यक mkdir -p लेने में कोई दर्द नहीं है तो आप if बयान से छुटकारा पा सकते।

किसी असाइनमेंट में कोट्स की आवश्यकता नहीं है, इसलिए आप उन्हें dir= लाइन से हटा सकते हैं। हालांकि, उद्धरण हर जगह एक अच्छा विचार है, इसलिए अन्य उद्धरणों को हटाएं।

लूप के लिए अतिरिक्त .* जोड़ने के लिए अच्छा हो सकता है। इस तरह यदि आप स्क्रिप्ट को एक से अधिक बार चलाते हैं तो यह उन नव निर्मित उप-निर्देशिकाओं को स्थानांतरित करने की कोशिश नहीं करेगा। और एक साफ चाल (यद्यपि आवश्यक रूप से सुधार नहीं) BR*.* W0*.* से {BR,W0}*.* को छोटा करना है।

for file in {BR,W0}*.*; do 
    dir=${file%%.*} 
    mkdir -p "$dir" 
    mv "$file" "$dir" 
done 
0

आप कुछ इस तरह की कोशिश कर सकते हैं:

बीआर * में फ़ाइल के लिए WO *; करते dir = $ ($ {फ़ाइल} गूंज |।। awk -F ओएफएस = '{$ 1 प्रिंट}') mkdir $ dir mv $ फ़ाइल $ dir

किया मैं एक ऐसी ही स्थिति थी और इस काम मेरे लिए।

संबंधित मुद्दे