2013-02-12 64 views
17

एक निर्देशिका में आपके पास कुछ विभिन्न फ़ाइलें हैं - .txt, .sh और फिर .foo संशोधक के बिना फ़ाइलों की योजना बनाएं।bash ~ निर्देशिका में विशिष्ट फ़ाइलों पर लूप के लिए

आप निर्देशिका ls हैं:

blah.txt 
blah.sh 
blah 
blahs 

मैं कैसे बता के लिए लूप केवल एक .foo बिना फ़ाइलों का उपयोग करने के लिए एक संशोधित करूँ? तो उपरोक्त उदाहरण में फाइलों blah और blahs पर "सामान करो"।

बुनियादी वाक्य रचना है:

#!/bin/bash 
FILES=/home/shep/Desktop/test/* 

for f in $FILES 
do 
    XYZ functions 
done 

आप देख सकते हैं यह प्रभावी रूप से निर्देशिका में सब कुछ खत्म हो गया लूप। मैं .sh, .txt या किसी अन्य संशोधक को कैसे बाहर निकाल सकता हूं?

मैं कुछ विवरणों के साथ खेल रहा हूं लेकिन मैं वास्तव में उत्सुक हूं यदि मैं उन संशोधित फ़ाइलों के लिए चयन कर सकता हूं।

क्या कोई मुझे इन सादे पाठ फ़ाइलों के लिए .txt के बिना उचित शब्दकोष बता सकता है?

उत्तर

29
#!/bin/bash 
FILES=/home/shep/Desktop/test/* 

for f in $FILES 
do 
if [[ "$f" != *\.* ]] 
then 
    DO STUFF 
fi 
done 
+0

यह मेरे लिए एक संशोधित रूप में काम करता है। मेरे कुछ फ़ाइल नामों में "।" है, इसलिए * \। * का उपयोग कर उन्हें अभी भी चुन सकते हैं। आपके कोड के लिए क्या उपयोग किया जाता है? धन्यवाद! –

+1

यह केवल बैश (अगर पीछे की ओर) के लिए endif है। –

+0

हम्म ऐसा होगा कि 'किया' ने एक त्रुटि फेंक दी, अगर कथन को बंद करने के लिए आवश्यक है। अच्छा है धन्यवाद। –

1

आप नकारात्मक वाइल्डकार्ड का उपयोग कर सकते हैं? उन्हें बाहर फिल्टर करने के लिए:

$ ls -1 
a.txt 
b.txt 
c.png 
d.py 
$ ls -1 !(*.txt) 
c.png 
d.py 
$ ls -1 !(*.txt|*.py) 
c.png 
+0

ठीक है, लेकिन कहते हैं कि मैं उनमें से दो से अधिक के साथ एक निर्देशिका है। क्या मेरे लिए यह करने के लिए एक तार्किक तरीका है? ताकि इसे उसी तरह काम करते समय अधिकांश निर्देशिकाओं पर लागू किया जा सके। –

+0

@jon_shep: दो से अधिक क्या? – Blender

+0

फ़ाइल एक्सटेंशन। आपके उदाहरण में आपको मैन्युअल रूप से उन्हें बहिष्कृत करना पड़ा था। –

10

आप इसे थोड़ा और अधिक जटिल है, आप पा-आदेश का उपयोग कर सकते हैं।

वर्तमान निर्देशिका के लिए:

for i in `find . -type f -regex \.\\/[A-Za-z0-9]*` 
do 
WHAT U WANT DONE 
done 

स्पष्टीकरण:

find . -> starts find in the current dir 
-type f -> find only files 
-regex -> use a regular expression 
\.\\/[A-Za-z0-9]* -> thats the expression, this matches all files which starts with ./ 
(because we start in the current dir all files starts with this) and has only chars 
and numbers in the filename. 

http://infofreund.de/bash-loop-through-files/

+0

अच्छी चीजें! मैंने अभी तक उस आदेश का उपयोग नहीं किया है –