2010-01-18 13 views
35

मैं find कमांड का उपयोग कर फ़ाइल नामों की एक सूची स्टोर करने के लिए एक सरणी का उपयोग करने का प्रयास कर रहा हूं।मैं बैश स्क्रिप्ट में खोजने के परिणामों को कैसे संसाधित कर सकता हूं?

किसी कारण से सरणी स्कूल द्वारा उपयोग किए जाने वाले बैश में काम करने में विफल रहता है, मेरा प्रोग्राम हालांकि अपने लैपटॉप पर काम करता है।

array = (`find . -name "*.txt"`) #this will store all the .txt files into the array 

तब मैं सरणी आइटम एक्सेस और सभी बिल्ली आदेश का उपयोग फ़ाइलों की एक प्रतियां बना सकते हैं: वहाँ एक और तरीका यह करने के लिए अगर

तो मैं सोच रहा था, इस मैं क्या है।

क्या कोई सरणी का उपयोग किए बिना ऐसा करने का कोई और तरीका है?

find . -name '*.txt' | while read line; do 
    echo "Processing file '$line'" 
done 

जैसे:

उत्तर

75

आप ऐसा ही कुछ इस्तेमाल कर सकते हैं एक प्रतिलिपि बनाने:

find . -name '*.txt' | while read line; do 
    echo "Copying '$line' to /tmp" 
    cp -- "$line" /tmp 
done 

HTH

+0

बहुत बहुत शुक्रिया !! यह काम करता है और मैंने कुछ नया – Shellscriptbeginner

+0

सीख लिया है 'फॉर' लूप का उपयोग करना निश्चित रूप से यहां एक बेहतर विकल्प है। एक सरणी का उपयोग करना काम करेगा सिवाय इसके कि यह पूरी सूची को एक चर में पढ़ता है और फिर परिवर्तनीय पर फिर से चलाता है। यह संस्करण प्रत्येक फ़ाइल नाम को पढ़ता है क्योंकि यह 'ढूंढ' से आता है और इसे इनलाइन प्रक्रिया करता है। –

+0

डी। शॉली, क्या आप कृपया लूप के साथ नमूना पोस्ट कर सकते हैं? मुझे लगता है कि नाम में रिक्त स्थान वाली फाइलों के लिए भी काम करना चाहिए। –

2
find . -name '*.txt' | while IFS= read -r FILE; do 
    echo "Copying $FILE.." 
    cp "$FILE" /destination 
done 
6

बस बराबर चारों ओर खाली न रखें साइन इन करें:

ar=($(find . -name "*.txt")) 

,, बैकटिक से बचें यदि संभव हो तो, क्योंकि वे पदावनत कर रहे हैं। उन्हें आसानी से एस्ट्रोफ के साथ भ्रमित किया जा सकता है, खासतौर पर खराब फोंट में, और वे इतने अच्छी तरह से घोंसला नहीं करते हैं।

यदि आप सीधे खोज-परिणाम के माध्यम से -exec, -execdir, -ok या -okdir के साथ पुन: प्रयास करते हैं तो आपको सबसे अच्छी सेवा दी जाएगी।

फ़ाइल नामों या न्यूलाइन और टैब में रिक्त स्थान की बात करते समय लूप को सही करना मुश्किल होता है।

find ./ -name "*.txt" -exec grep {} ";" 

{} मास्किंग जरूरत नहीं है। आप अक्सर xargs जो एक अतिरिक्त प्रक्रिया भी शुरू होता है देखेंगे संयोजन मिलता है /:

find ./ -name "*.txt" | xargs grep {} ";" 
14

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

for i in $(find . -name '*.mov'); 
do 
    echo "$i" 
done 
+1

यह फ़ाइल नामों में व्हाइटस्पेस के लिए विफल रहता है – spinup

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

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