2009-11-11 4 views
6

मैं एक ही एक्सटेंशन के साथ एकाधिक इनपुट फ़ाइलों पर एक पर्ल स्क्रिप्ट कैसे चला सकता हूं?मैं एक ही एक्सटेंशन के साथ एकाधिक इनपुट फ़ाइलों पर एक पर्ल स्क्रिप्ट कैसे चला सकता हूं?

perl scriptname.pl file.aspx 

मैं इसे मौजूदा निर्देशिका में सभी aspx फ़ाइलों के लिए चलाने

धन्यवाद है करने के लिए देख रहा हूँ!

+0

http://stackoverflow.com/questions/506009/ देखें स्कैनिंग-एकाधिक-फाइल-इन-पर्ल – daotoad

+0

क्या टर्मिनल में होने के बजाय आउटपुट को फ़ाइल में निर्यात करना संभव है? –

उत्तर

7

अपने पर्ल फ़ाइल में

my @files = <*.aspx>; 
for $file (@files) { 

     # do something. 

} 

<*.aspx> एक glob कहा जाता है।

+0

यह काम करता है, लेकिन केवल तभी जरूरी है जब आपके पास कोई शैल न हो जो आपके लिए नौकरी करता है (या स्क्रिप्ट एक जीयूआई लॉन्चर के माध्यम से लॉन्च की जाती है) - और यह सब लचीला नहीं है, भले ही यह नौकरी करे। –

+0

आपकी टिप्पणी के लिए धन्यवाद। लेकिन सवाल को दोबारा पढ़ते हुए, मुझे लगता है कि इस जवाब को योग्यता की आवश्यकता नहीं है। साथ ही, मैं कमांड लाइन का उपयोग करने के बजाय प्रोग्राम के अंदर "एस्पैक्स एक्सटेंशन के साथ सभी फाइलें" तर्क प्राप्त करना पसंद करूंगा। –

+0

@ जोनाथन: यह संभावना है कि ओपी 'cmd' खोल का उपयोग कर विंडोज पर चल रहा है। जहां तक ​​मुझे याद है, यूनिक्स शैल के रूप में 'cmd' वाइल्डकार्ड विस्तार नहीं करता है। –

1

यदि आप लिनक्स मशीन पर हैं, तो आप इस तरह कुछ कोशिश कर सकते हैं।

for i in `ls /tmp/*.aspx`; do perl scriptname.pl $i; done 
+1

एलएस का बेकार उपयोग। - मैं/tmp/* – ghostdog74

+0

वास्तव में, प्रश्न का उत्तर देने के लिए यह './*। aspx' होना चाहिए। –

+0

मुझे उन मामलों के लिए बहुत उपयोगी उपयोग मिल रहा है जिन्हें आप किसी निश्चित क्रम में फ़ाइलों को संसाधित करना चाहते हैं। उदाहरण के लिए, ls -tr ./*.aspx सभी फ़ाइलों पर पर्ल स्क्रिप्ट को क्रम में संशोधित क्रम में चलाएगा। – Ari

3

आप कमांड लाइन पर अपनी स्क्रिप्ट

foreach (@ARGV){ 
    print "file: $_\n"; 
    # open your file here... 
     #..do something 
    # close your file 
} 

में वाइल्डकार्ड

साथ पर्ल के लिए उन फ़ाइलों को पारित

$ perl myscript.pl *.aspx 
+3

विंडोज़ @ARGV पर केवल एक आइटम होगा: "* .aspx"। – n0rd

-2

तुम भी पथ आप जहां पारित कर सकते हैं कर सकते हैं अपने एएसपीएक्स फाइलें और उन्हें एक-एक करके पढ़ें।

#!/usr/bin/perl -w 

use strict; 

my $path = shift; 
my @files = split/\n/, `ls *.aspx`; 

foreach my $file (@files) { 
     do something... 
} 
+1

आपको ls को खोलने की आवश्यकता नहीं है, जो कुछ सिस्टम पर वैध कमांड भी नहीं हो सकता है। –

+0

यहां तक ​​कि उन सिस्टमों पर जहां 'ls' उपलब्ध है, यह यहां उपयोग करने का गलत टूल है, और इसमें [एकाधिक अच्छी तरह से प्रलेखित समस्याएं] हैं (http://mywiki.wooledge.org/ParsingLs)। पर्ल ने अंतर्निहित ग्लोबिंग किया है, इसलिए बस मेरी $ फ़ाइल (<*.aspx>) का अनुमान लगाएं या यदि आपकी ज़रूरतें कुछ हद तक जटिल हैं, तो कोड के कंकाल के रूप में, निर्देशिकाओं पर 'opendir' निर्देशिका और लूप', तब तक 'अगले तक' कर रहे हैं।लूप के अंदर के शीर्ष पर एएसपीएक्स $/'। – tripleee

2

आप glob स्पष्ट रूप से उपयोग कर सकते हैं, खोल व्यवहार पर ज्यादा करने के लिए निर्भर हुए बिना खोल पैरामीटर का उपयोग करने के लिए।

for my $file (map {glob($_)} @ARGV) { 
    print $file, "\n"; 
}; 

आपको एक से अधिक पैरामीटर विस्तारित एक फ़ाइल नाम डुप्लिकेट की संभावना को नियंत्रित करने की आवश्यकता हो सकती है।

0

-n या -p के साथ एक सरल एक लाइनर के लिए, यदि आप चाहते

perl -i~ -pe 's/foo/bar/' *.aspx 

-i~ जगह में प्रत्येक लक्ष्य फ़ाइल को संशोधित, और एक ~ प्रत्यय के साथ एक बैकअप के रूप मूल छोड़ने के लिए फ़ाइल को जोड़ा गया कहते हैं नाम। (बैकअप छोड़ने के लिए प्रत्यय को छोड़ दें। लेकिन यदि आप अभी भी सीख रहे हैं या प्रयोग कर रहे हैं, तो यह एक बुरा विचार है; बैकअप को हटाते समय बैकअप को हटाकर बैकअप से मूल को बहाल करने से बहुत छोटी परेशानी होती है यदि आप कुछ गड़बड़ करते हैं।)

यदि आपका पर्ल कोड (या बस पर्याप्त उपयोगी पुन: प्रयोज्य होने के लिए) स्पष्ट रूप से scriptname.pl साथ -e '# your code here' की जगह ... हालांकि तो शायद refactor scriptname.pl इतना है कि यह फ़ाइल नाम तर्कों की सूची को स्वीकार करता है एक एक लाइनर के लिए बहुत जटिल है, और वर्तमान निर्देशिका में सभी *.aspx फ़ाइलों पर चलाने के लिए बस scriptname.pl *.aspx का उपयोग करें।

यदि आपको निर्देशिका संरचना की पुन: सेवा करने और किसी विशेष नामकरण पैटर्न के साथ सभी फ़ाइलों को खोजने की आवश्यकता है, तो find उपयोगिता उपयोगी है।

find . -name '*.aspx' -exec perl -pi~ -e 's/foo/bar/' {} + 

अपने find का समर्थन नहीं करता -exec ... \; साथ -exec ... + कोशिश हालांकि यह धीमी हो और अधिक प्रक्रियाओं का शुभारंभ (फ़ाइल प्रति एक आप सभी फ़ाइलों को प्रोसेस करने के रूप में कुछ करने के बजाय लगता है) होगा।

केवल कुछ निर्देशिकाओं को स्कैन करने के लिए, की जगह . (जो नाम वर्तमान निर्देशिका) निर्देशिका के एक अंतरिक्ष अलग की गई सूची के साथ जांच, या यहाँ तक find का उपयोग निर्देशिका के लिए खुद को (और फिर शायद में कुछ कर रही के लिए -execdir का पता लगाने को खोजने के लिए करने के लिए प्रत्येक निर्देशिका जो find आपके जटिल, जटिल, व्यापार-महत्वपूर्ण के साथ चयन करती है, शायद find विकल्प की गुप्त सूची भविष्यवाणी करती है)।

शायद इस निर्देशिका को पर्ल में मूल रूप से रिकर्सन करने के लिए find2perl का पता लगाएं।

0

उदाहरण संभाल करने के लिए perl scriptname.pl *.aspx *.asp

linux में: खोल वाइल्डकार्ड फैलता है, इसलिए पर्ल बस

for (@ARGV) { 
    operation($_); # do something with each file 
} 

विंडोज का विस्तार नहीं करता वाइल्डकार्ड इतनी के रूप में पर्ल में प्रत्येक तर्क में वाइल्डकार्ड का विस्तार किया जा सकता है इस प्रकार है। पाश के लिए तो ऊपर

for (map {glob} @ARGV) { 
    operation($_); # do something with each file 
} 

उदाहरण के लिए के रूप में एक ही तरह से प्रत्येक फ़ाइल संसाधित करता है, इस विंडोज

के तहत विस्तृत सूची प्रिंट होगा
print "$_\n" for(map {glob} @ARGV); 
संबंधित मुद्दे

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