2010-03-31 5 views
5

मेरे पास फाइलों की एक सूची है जिसे मैं प्रतिलिपि बनाने और स्थानांतरित करने की कोशिश कर रहा हूं (सीपी और एमवी का उपयोग करके) एक बैश खोल स्क्रिप्ट में। जिस समस्या में मैं चल रहा हूं, वह यह है कि मुझे बड़ी संख्या में फाइलों को पहचानने के लिए कमांड नहीं मिल सकता है, ऐसा लगता है कि फ़ाइल नामों में रिक्त स्थान और/या यूनिकोड वर्ण होते हैं। मुझे इन पात्रों को डीकोड/पुनः-एन्कोड करने के लिए कोई स्विच नहीं मिला। इसके बजाए, उदाहरण के लिए, यदि मैं "file name.xml" की प्रतिलिपि बनाता हूं, तो मुझे "* .xml" और एक स्क्रिप्ट त्रुटि मिलती है जो फ़ाइल मेरे परिणाम के लिए नहीं मिली थी। क्या कोई भी सेटिंग या कमांड जानता है जो इन फ़ाइलों से निपटेंगे?शैल स्क्रिप्ट का उपयोग करते समय, मैं रिक्त स्थान और यूनिकोड वाले नामों वाली फ़ाइलों की प्रतिलिपि कैसे बना सकता हूं?

संपादित करें (वर्तमान कोड जोड़ने): जब मैं चलाएँ:

इस macbookpro: डेस्कटॉप $ ./script.sh

#!/bin/sh 
dateVar=`date +%Y-%m-%d` 
mkdir /Volumes/Documents/SMSarchive/$dateVar 
cd /Volumes/Documents/SMSarchive/SMSdrop 
for i in *.xml 
do 
cp $i /Volumes/Documents/SMSarchive/$dateVar/$dateVar-$i 
done 

मैं संदेश मिलता है:

उपयोग: सीपी [- आर [-एच | -एल | -पी]] [-फि | -एन] [-पीवीएक्स] स्रोत_फाइल target_file सीपी [-आर [-एच | -एल | -पी]] [-फि | -एन] [-पीवीएक्स] स्रोत_फाइल ... target_directory

... जब यह "सीपी" कमांड को हिट करता है। वास्तव में स्क्रिप्ट के लिए और अधिक है, जो प्रतिलिपि बनाई गई फ़ाइलों को आगे संसाधित करता है। "नियमित" फ़ाइल नाम के साथ उदा। 'file.xml', सब कुछ ठीक काम करता है। यह केवल रिक्त स्थान, या यूनिकोड वर्णों वाली फाइलें हैं, जहां मुझे समस्याएं हैं।

उत्तर

16

रिक्त स्थान के साथ समस्याएं इंगित करती हैं कि अपर्याप्त उद्धरण किया गया है। निम्नलिखित गलत है:

someprogram $file 

सही संस्करण इस प्रकार है:

someprogram "$file" 
+0

धन्यवाद! कोड को बदलना: सीपी "$ i"/वॉल्यूम/दस्तावेज़/एसएमएसआर्किव/$ डेटवारा/"$ dateVar" - "$ i" ... पूरी तरह से काम किया! – LOlliffe

+1

या यहां तक ​​कि: 'सीपी" $ i ""/वॉल्यूम्स/दस्तावेज/एसएमएसआर्किव/$ डेटवायर/$ डेटवारा- $ i "'। एक शेल स्क्रिप्ट में, * हमेशा * उद्धरण चर तब तक जब तक आपके पास कोई विशिष्ट कारण न हो। –

1

कोड त्रुटियों के लिए देखना जब $ मैं शून्य है! यह घातक आरएम-आरएफ त्रुटियों का परिणाम हो सकता है!

0

कभी-कभी खोल उद्धरण से निपटने के बजाय आसान तरीके होते हैं। आपके मामले में मैं find -print0 और xargs -0 का उपयोग करूंगा। शून्य वर्ण समाप्ति से आप आसानी से रिक्त स्थान के साथ तारों को कुशलतापूर्वक उपयोग कर सकते हैं (यानी फ़ाइल नामों की सूचियां)।

अपने उदाहरण के लिए, कोड कुछ इस तरह दिखेगा:

#!/bin/sh 
dateVar=`date +%Y-%m-%d` 
mkdir /Volumes/Documents/SMSarchive/$dateVar 
cd /Volumes/Documents/SMSarchive/SMSdrop 
find . -maxdepth 1 -name '*.xml' -print0 | \ 
xargs -0 -I {} cp {} /Volumes/Documents/SMSarchive/$dateVar/$dateVar-{} 
संबंधित मुद्दे

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