2012-06-12 6 views
9

मुझे पहले अपनी स्थिति का वर्णन करने दें, मैं एक लिनक्स प्लेटफ़ॉर्म पर काम कर रहा हूं और .bmp फ़ाइलों का संग्रह है जो filename0022.bmp से filename0680.bmp तक चित्र संख्या में से एक को जोड़ता है। तो कुल 658 चित्र। मैं इन तस्वीरों में से प्रत्येक को एक .exe फ़ाइल के माध्यम से चलाने में सक्षम होना चाहता हूं जो चित्र पर चलती है, फिर उपयोगकर्ता द्वारा निर्दिष्ट फ़ाइल में फ़ाइल को बाहर निकाल देती है, इसमें कुछ थ्रेसहोल्ड तर्क भी होते हैं: निचला, ऊपरी। तो निष्पादन के लिए विशिष्ट कॉल है:लिनक्स में टर्मिनल में निष्पादन योग्य कमांड को कैसे लूप करें?

./filter inputfile outputfile lower upper 

वहाँ एक रास्ता है कि मैं पाश बस टर्मिनल से या बैश स्क्रिप्ट के कुछ प्रकार बनाने के द्वारा सभी फाइलों पर इस कॉल कर सकते हैं है? मेरी समस्या इस तरह है: Execute a command over multiple files with a batch file लेकिन इस बार मैं एक लिनक्स कमांड लाइन टर्मिनल में काम कर रहा हूं।

for i in *; do 
    echo "$i" | tr '[:lower:]' '[:upper:]' 
done 

आप एक विशेष पथ है, तो बदल * अपना रास्ता + एक ग्लोब द्वारा: उदाहरण के लिए:

उत्तर

6

आप कुछ इस तरह की कोशिश कर सकते हैं ...

#! /bin/bash 
for ((a=022; a <= 658 ; a++)) 
do 
    printf "./filter filename%04d.bmp outputfile lower upper" $a | "sh" 
done 
+1

यहां मैंने कोशिश की है और यह मेरी स्क्रीन पर कुछ हद तक प्रासंगिक चीजों का एक गुच्छा मुद्रित किया है लेकिन वास्तव में कोई भी फाइल नहीं बनाई है ... #!/Bin/bash के लिए ((एक = 022; एक <= 680; एक ++)) printf करते हैं "./filter भ्रूण-00-2.3.5um__voi0% 04d.bmp fetus_threshold_% 04d 90 240" $ एक किया जहां 90 और 240 निचले और ऊपरी तर्क हैं जिन्हें मैंने पहले उल्लेख किया था। मैंने एक बैश स्क्रिप्ट नहीं बनाई है इसलिए मैंने केवल एक फ़ाइल बनाने के लिए emacs का उपयोग किया जहां मैंने कोड की पिछली पंक्तियां टाइप कीं। मैंने फिर Emacs फ़ाइल को परीक्षण के रूप में सहेजा। इसके पीछे कुछ भी नहीं है क्योंकि मैंने कुछ उदाहरण ऑनलाइन देखा है। कोई और सुझाव? –

+0

इसे एक .sh फ़ाइल (ऊपर किए गए नए जोड़े के साथ) में बनाने का प्रयास करें और फिर उसी निर्देशिका में [[bash myfile.sh]] टाइप करके फ़ाइल चलाएं – scottyaz

+0

अच्छा, अच्छी खबर ... यह कम से कम इसे पुन: सक्रिय करती है समय के आसपास और यह पहली छवि पर भी काम करता है, तो मुझे निष्पादन योग्य उपयोग करने वाले सॉफ़्टवेयर से कुछ त्रुटियां आती हैं। जिस चीज को मैं समझ नहीं पा रहा हूं वह यह है कि यह inputfile0000 पर शुरू करने की कोशिश कर रहा है और हम इसे inputfile0022.bmp से शुरू करने के लिए कहते हैं। मुझे प्राप्त होने वाली एकमात्र आउटपुट छवि outputfile0000.bmp है। यहां बैश फ़ाइल है जिसे मैंने threshold.sh: # के रूप में सहेजा है!/bin/bash ((ए = 022; एक <= 680; ए ++)) printf "./filter6 भ्रूण -00-2_3.5um__rec_voi% 04d.bmp fetus_threshold_% 04d.bmp 90 240" $ a | "sh" किया –

1

आप अपने खोल में है कि AS-IS परीक्षण कर सकते हैं

for i in /home/me/*.exe; do ... 

देखें http://mywiki.wooledge.org/glob

+0

संभालने वह सही निर्देशिका में है: =) – ant

+1

इस संभावना को समझाने के लिए संपादित =) –

+0

हे sputnick, तुम मुझे कोड का सा आप ऊपर लिखा समझने में मदद कर सकता है? मैं देख सकता हूं कि आपके पास सब कुछ खत्म हो रहा है लेकिन छवियों को संसाधित करने के लिए आपने कभी निष्पादन योग्य कहां नहीं देखा है। क्या आप मुझे थोड़ा और विस्तार और स्पष्टीकरण दे सकते हैं? आपकी मदद और पदों के लिए धन्यवाद। इतने कम समय में यह बहुत मदद प्राप्त करना बहुत अच्छा है। –

0

यह आउटपुट छवियों का नाम प्रीपेड करते समय filtered_filename0055.bmp

for i in *; do 
    ./filter $i filtered_$i lower upper 
done 
+0

यह मुझे लगता है कि स्रोत फ़ाइल ओवरराइट करेगा। –

+0

क्या होगा यदि फ़ाइल में कोई स्थान है? फिर आदेश './filter फ़ाइल को स्पेस filtered_file साथ स्पेस निचला ऊपरी' के साथ हल करेगा। जब आप इसका उपयोग कर रहे हों तो आपको शायद "$ i" उद्धृत करना चाहिए। –

+1

@TimPote बस इसे प्रश्न जानकारी के आधार पर जितना संभव हो सके उतना सरल बनाने की कोशिश कर रहा है, लेकिन हाँ उद्धरण फ़ाइल एक्सटेंशन और निर्देशिका के लिए कुछ जांच भी बेहतर कर देगा। –

11

आप बैश पटकथा में देख में रुचि हो सकती।

आप सीधे शेल से लूप के लिए आदेश निष्पादित कर सकते हैं।

आपके द्वारा विशेष रूप से वर्णित संख्याओं को उत्पन्न करने के लिए एक सरल पाश। उदाहरण के लिए, खोल से:

[email protected] $ for i in {22..680} ; do 
> echo "filename${i}.bmp" 
> done 

यह आपको एक सूची filename22.bmp से filename680.bmp को दे देंगे। यह आपके द्वारा वर्णित सीमा के पुनरावृत्ति को आसानी से संभालता है। इसमें शून्य पैडिंग नंबर शामिल नहीं हैं। ऐसा करने के लिए आप printf का उपयोग कर सकते हैं। printf वाक्यविन्यास printf format argument है। हम तर्क के रूप में हमारे पिछले लूप से $i चर का उपयोग कर सकते हैं और %Wd प्रारूप लागू कर सकते हैं जहां डब्ल्यू चौड़ाई है। डब्ल्यू प्लेसहोल्डर का उपसर्ग करने के लिए वर्ण निर्दिष्ट करेगा। उदाहरण:

[email protected] $ for i in {22..680} ; do 
> echo "filename$(printf '%04d' $i).bmp" 
> done 

एक चर के रूप में ऊपर $() कृत्यों में, को क्रियान्वित करने आदेशों एक पूर्वनिर्धारित मूल्य के लिए विरोध मूल्य प्राप्त करने के लिए।

यह अब आपको निर्दिष्ट फ़ाइल नाम देना चाहिए। हम चाहते हैं कि लेने के लिए और वास्तविक आवेदन करने के लिए इसे लागू कर सकते हैं:

[email protected] $ for i in {22..680} ; do 
> ./filter "filename$(printf '%04d' $i).bmp" lower upper 
> done 

यह लिखा जा सकता है एक लाइन बनाने के लिए: सवाल से नोट करने के लिए

[email protected] $ for i in {22..680} ; do ./filter "filename$(printf '%04d' $i).bmp" lower upper ; done 

एक बात .exe फ़ाइलें आम तौर पर में संकलित COFF प्रारूप जहां लिनक्स ELF निष्पादन योग्य प्रारूप की अपेक्षा करता है।

for i in {1..100}; do echo "Hello Linux Terminal"; done 

एक फाइल करने के लिए संलग्न करने के लिए: (>> संलग्न करने के लिए प्रयोग किया जाता है, तो आप भी उपयोग कर सकते हैं> अधिलेखित करने के लिए)

for i in {1..100}; do echo "Hello Linux Terminal" >> file.txt; done 
+0

'user @ machine $ 'एक शेल प्रॉम्प्ट अनुकरण करना है,'> 'निष्पादन के लिए कमांड पूरा करने से पहले शीघ्र निरंतरता की अपेक्षा करता है। –

7

यहाँ एक सरल उदाहरण है

ls | xargs -i ./filter {} {}_out lower upper 

नोट::

012,351 बार-बार दोहराना के लिए
  • {} पाइप से एक लाइन आउटपुट के अनुरूप है, यहां यह इनपुटफ़ाइल नाम है।
  • आउटपुट फ़ाइलों को पोस्टफिक्स '_out' के साथ नामित किया जाएगा।
संबंधित मुद्दे