2012-07-02 4 views
6

मेरे पास एक निर्देशिका में एक्सएमएल फाइलों का एक गुच्छा है जिसे उन पर dos2unix कमांड करने की आवश्यकता है और नई फाइलों को हर बार जोड़ा जाएगा। मैं हर बार प्रत्येक फाइल पर dos2unix कमांड मैन्युअल रूप से करने की बजाय मैं इसे सभी को एक स्क्रिप्ट के साथ स्वचालित करना चाहता हूं। मैं भी मेरे जीवन में एक खोल स्क्रिप्ट में कभी नहीं देखा है, लेकिन अभी तक मैं इस राशि मैं कुछ ट्यूटोरियल पर क्या पढ़ा है से:शैल स्क्रिप्ट का उपयोग करके dos2unix को स्वचालित करने के लिए कैसे करें?

FILES=/tmp/testFiles/* 
for f in $FILES 
do 
    fname=`basename $f` 
    dos2unix *.xml $f $fname 
done 

हालांकि मैं हो रही है 'उपयोग' उत्पादन को दिखा रहा रखने के लिए। मुझे लगता है कि समस्या यह है कि मैं नई फाइल का नाम सही ढंग से निर्दिष्ट नहीं कर रहा हूं (fname)। क्या कोई मदद कर सकता है।

धन्यवाद, एलन

उत्तर

6

आपको उपयोग संदेश प्राप्त करने का कारण यह है कि dos2unix आपके द्वारा आपूर्ति की जा रही अतिरिक्त तर्क नहीं लेता है। हालांकि, यह कई फ़ाइल नाम स्वीकार करेगा (ग्लोब के माध्यम से भी)। आपको लूप की आवश्यकता नहीं है जब तक आप कमांड लाइन पर स्वीकार किए जाने से अधिक फ़ाइलों को संसाधित नहीं कर लेते।

dos2unix /tmp/testFiles/*.xml 

होना चाहिए आप सभी की जरूरत है, जब तक आप प्रत्यावर्तन की जरूरत है:

find /tmp/testFiles -name '*.xml' -exec dos2unix {} + 

(जीएनयू के लिए लगता है)

1
mkdir /tmp/testFiles/converted/ 
for f in /tmp/testFiles/*.xml 
do 
    fname=`basename $f` 
    dos2unix $f ${f/testFiles\//testFiles\/converted\/} 
    # or for pure sh: 
    # dos2unix $f $(echo $f | sed [email protected]/@testFiles/converted/@) 
done 

परिणाम converted/ उपनिर्देशिका में सहेज लिया जाएगा।

निर्माण ${f/testFiles\//testFiles\/converted\/} (धन्यवाद रश के लिए) या sed फ़ाइल का नाम पहले converted/ जोड़ने के लिए यहाँ प्रयोग किया जाता है: तो

$ echo /tmp/testFiles/1.xml | sed [email protected]/@testFiles/converted/@ 
/tmp/testFiles/converted/1.xml 
+0

धन्यवाद, लेकिन आप इस क्या करता है व्याख्या कर सकते हैं: "$ (echo $ च | sed रों @ testFiles/@ testFiles/परिवर्तित /)" संपादित करें: इस आदेश काम नहीं करता। त्रुटि: sed: कमांड कमांड: एस @ testFiles/@ testFiles/परिवर्तित /, sed कमांड को हटाने से त्रुटि मिलती है: COuld इनपुट फ़ाइल नहीं खोलता FILES –

+0

मैं बस फ़ाइल के उस नाम से पहले 'परिवर्तित /' जोड़ता हूं। –

+2

आपको इसके लिए 'sed' की आवश्यकता नहीं है। आप इसे '$ {f/testFiles \ // testFiles \/convert \ /}' – rush

2

सभी फाइलों को एक निर्देशिका (कोई प्रत्यावर्तन आवश्यक) में हैं, तो तुम लगभग वहां थे।

for file in /tmp/testFiles/*.xml ; do 
    dos2unix "$file" 
done 

डिफ़ॉल्ट dos2unix तक जगह में बदल जाएंगे और मूल के ऊपर लिख चाहिए। कौन सा /tmp/testFiles/ में .xml और उसके उप-निर्देशिका के सभी के साथ समाप्त सभी फाइलों पर काम करेंगे

find /tmp/testFiles -name '*.xml' -print0 | while IFS= read -d '' file ; do 
    dos2unix "$file" 
done 

:

प्रत्यावर्तन की जरूरत है, तो आप के रूप में अच्छी find का उपयोग करना होगा।

कोई अन्य कदम आप खोल पाश पूरी तरह छोड़ सकते हैं की आवश्यकता होती है, तो:

गैर पुनरावर्ती:

find /tmp/testFiles -maxdepth 1 -name '*.xml' -exec dos2unix {} + 

और पुनरावर्ती के लिए:

find /tmp/testFiles -name '*.xml' -exec dos2unix {} + 

अपने मूल आदेश मैं देख रहा हूँ में आपको प्रत्येक फ़ाइल नाम का मूल नाम मिल रहा है और इसे dos2unix पर पास करने का प्रयास कर रहा है, लेकिन आपका इरादा स्पष्ट नहीं है। बाद में, एक टिप्पणी में, आप कहते हैं कि आप बस फाइलों को ओवरराइट करना चाहते हैं। मेरा समाधान रूपांतरण करता है, कोई बैकअप नहीं बनाता है और परिवर्तित संस्करण के साथ मूल को ओवरराइट करता है। मुझे उम्मीद है कि यह आपका इरादा था।

+1

वह विस्तारित ग्लोब के परिणाम संग्रहित नहीं कर रहा है। असाइनमेंट पर ग्लोब का विस्तार नहीं किया गया है। –

+0

@ डेनिसविल्लियमसन: मुझे लगता है कि आप सही हैं। मैंने इस टिप्पणी को हटा दिया है, सुधार के लिए धन्यवाद। – Sorpigal

0

यह स्पष्ट dos2unix की जो कार्यान्वयन प्रयोग कर रहे हैं नहीं है। विभिन्न कार्यान्वयन के लिए विभिन्न तर्कों की आवश्यकता होती है। चारों ओर कई अलग-अलग कार्यान्वयन हैं।

RedHat/Fedora/Suse लिनक्स पर तुम सिर्फ टाइप कर सकते हैं

dos2unix /tmp/testFiles/*.xml 

SunOS पर आप एक इनपुट और आउटपुट फ़ाइल नाम देने के लिए आवश्यक है, और उपरोक्त आदेश आपकी फ़ाइलों के कई को नष्ट कर देगी।

आप किस संस्करण का उपयोग कर रहे हैं?

संबंध है, इरविन