2012-02-04 15 views
6

"के लिए" का उपयोग कर रहा निम्नलिखित बैश शेल स्क्रिप्ट का उपयोग रिकर्सिवली वर्तमान निर्देशिका के अंतर्गत ".txt" फ़ाइलों की सूची के लिए फ़ाइलें:बैश शेल सूची पाश

#!/bin/bash 
for file in $(find . -type f -name "*.txt") 
do 
    echo $file 
    # Do something else. 
done 

हालांकि, ".txt" फ़ाइलों में से कुछ वर्तमान निर्देशिका के तहत उनके नामों में रिक्त स्थान हैं, उदाहरण के लिए "मेरा test.txt"। लिस्टिंग दूषित हो गई है, उदा। के रूप में

my 
testing.txt 

ऐसा लगता है कि "के लिए" पाश "श्वेत स्थान" का उपयोग करता है (अंतरिक्ष, \ N आदि) फ़ाइल सूची अलग करने के लिए "मेरे testing.txt" सूचीबद्ध है लेकिन मेरे मामले में मैं केवल उपयोग करना चाहते हैं "\ n" फाइल सूची को अलग करने के लिए।

क्या इस उद्देश्य को प्राप्त करने के लिए मैं इस स्क्रिप्ट को संशोधित कर सकता हूं। कोई उपाय।

अग्रिम धन्यवाद।

+0

बैश में, मुझे लगता है कि आप 'ढूंढें ... -प्रिंट 0' और' आईएफएस = "\ 0" 'या' वहां उपयोग करते हैं। इस विषय पर निश्चित रूप से अन्य प्रश्न हैं। –

उत्तर

7

आप बैश 4 उपयोग कर रहे हैं, बस एक ग्लोब का उपयोग के बारे में चिंता करने के लिए इस्तेमाल करते हैं और नहीं हो सकता है:

#!/bin/bash                  

shopt -s globstar 

for file in **/*.txt 
do 
    if [[ ! -f "$file" ]] 
    then 
     continue 
    fi 
    echo "$file" 
    # Do something else.               
done 

"$file" उद्धृत करने के लिए सुनिश्चित करें अन्यथा आप कहीं एक ही समस्या होगा। ** यदि आप globstar सक्षम कर चुके हैं तो फ़ाइलों और निर्देशिकाओं से दोबारा मिलान करेंगे।

+0

धन्यवाद। यह मेरे मामले के लिए काम करता है। – user1129812

7

हां, find एनयूएल के साथ फ़ाइल नाम अलग करें और पर NUL पर पहुंचने के लिए उपयोग करें। यह किसी भी फ़ाइल नाम पर सफलतापूर्वक पुन: सक्रिय हो जाएगा क्योंकि एनयूएल फ़ाइल नाम के लिए एक वैध चरित्र नहीं है।

#!/bin/bash 
while IFS= read -r -d '' file; do 
    echo "$file" 
    # Do something else. 
done < <(find . -type f -name "*.txt" -print0) 

वैकल्पिक रूप से, अगर # do something else बहुत जटिल नहीं है, आप find के -exec विकल्प उचित परिसीमन

+0

धन्यवाद। लेकिन विधि मुझे कम परिचित लगती है। मैं इसे बाद में कोशिश करूंगा। – user1129812

+1

'ढूंढ' का बेवकूफ उपयोग इस तरह कुछ है। $ में फ़ाइल के लिए समस्या (ढूंढें ...) 'ठीक है कि यह व्हाइटस्पेस पर विभाजित होगा। इसके बजाय, 'ढूंढें ... | फाइल पढ़ने के दौरान '। 'पढ़ने' के लिए अतिरिक्त विकल्प को नए नामों के साथ फ़ाइल नामों का सही ढंग से सामना करने की आवश्यकता है, लेकिन यदि आपको केवल सभी जगहों का सामना करना पड़ता है, तो आप थोड़ी-थोड़ी चमकदार हो सकते हैं। – tripleee

+0

यह विधि मेरे मामले के लिए एक अच्छा वैकल्पिक समाधान है क्योंकि यह मनमाने ढंग से स्वीकार्य फ़ाइल नामों की अनुमति देता है। विधि अब ठीक से जांच की गई है और मेरे मामले के लिए भी काम करता है। – user1129812

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