2010-01-27 14 views
24

संभव डुप्लिकेट:
How can I list all of the files in a directory with Perl?मैं पर्ल में निर्देशिका में फ़ाइलों के माध्यम से कैसे लूप कर सकता हूं?

मुझे लगता है कि सभी एक ही निर्देशिका में शामिल हैं कुछ सौ फ़ाइलों के माध्यम से लूप करना चाहते हैं। मैं पर्ल में यह कैसे करूँगा?

+1

क्या यह प्रश्न इस पर एक डुप्लीकेट नहीं है? http://stackoverflow.com/questions/1045792/how-can-i-list-all-of-the-files-in-a-directory-with-perl –

+1

@ लियोनार्डो हेरेरा वास्तव में, यह है। क्षमा करें, मुझे वह याद नहीं आया। बंद करने के लिए वोटिंग। –

+0

मुझे नहीं लगता कि यह एक डुप्लिकेट कैसे है। प्रश्न पूछता है कि निर्देशिका में फ़ाइलों के माध्यम से लूप कैसे करें। चिह्नित 'डुप्लिकेट' निर्देशिका में सभी फ़ाइलों को सूचीबद्ध करने के लिए कहता है। स्पष्ट रूप से अलग है। डुप्लिकेट के रूप में चिह्नित क्यों करें? – CJ7

उत्तर

13

आप readdir या glob उपयोग कर सकते हैं।

या, आप इस तरह के Path::Class के रूप में एक मॉड्यूल का उपयोग कर सकते हैं:

आमतौर children() स्वयं और माता पिता के प्रविष्टियाँ शामिल नहीं होंगे। और .. (या गैर-यूनिक्स सिस्टम पर उनके समकक्ष), क्योंकि यह मेरे जैसे-दादा व्यवसाय की तरह है। आप इन विशेष सहित सभी निर्देशिका प्रविष्टियों चाहते हैं, तो सभी पैरामीटर के लिए एक सही मूल्य पारित: - यूनिक्स पर इसका मतलब यह है को छोड़कर

@c = $dir->children(); # Just the children 
@c = $dir->children(all => 1); # All entries 

अलावा, वहाँ एक no_hidden पैरामीटर है कि सभी सामान्य रूप से "छिपा" प्रविष्टियों को बाहर निकाल देगा है सभी प्रविष्टियों कि एक बिंदु के साथ शुरू करते हैं (.):

@c = $dir->children(no_hidden => 1); # Just normally-visible entries 

या, Path::Tiny:

@paths = path("/tmp")->children; 
@paths = path("/tmp")->children(qr/\.txt$/); 

एक निर्देशिका में सभी फ़ाइलों और निर्देशिकाओं के लिए Path::Tiny वस्तुओं की एक सूची देता है। "." और ".." को स्वचालित रूप से बहिष्कृत करता है।

एक वैकल्पिक qr// तर्क प्रदान की जाती है, तो वह केवल बच्चे के नाम है जो दिए गए रेगुलर एक्सप्रेशन से मेल के लिए वस्तुओं देता है। सिर्फ आधार नाम मिलान के लिए प्रयोग किया जाता है:

@paths = path("/tmp")->children(qr/^foo/); 
# matches children like the glob foo* 

एक सरणी कचरे में कुछ स्मृति निर्देशिका प्रविष्टियों की सूची हो रही है (जैसा कि एक समय में एक फ़ाइल नाम हो रही है के खिलाफ) है, लेकिन केवल कुछ सौ फाइलों के साथ , यह एक मुद्दा होने की संभावना नहीं है।

Path::Class * nix और Windows के अलावा अन्य ऑपरेटिंग सिस्टम के लिए पोर्टेबल है। दूसरी ओर, AFAIK, इसके उदाहरणों अधिक स्मृति का उपयोग की तुलना में Path::Tiny उदाहरणों से करते हैं।

यदि स्मृति कोई समस्या है, तो while लूप में readdir का उपयोग करना बेहतर होगा।

+0

और reead_dir हटा देता है। और .. आपके लिए, और यदि आवश्यकता हो तो फ़ाइल को फ़ाइल नाम –

43
#!/usr/bin/perl -w 

@files = <*>; 
foreach $file (@files) { 
    print $file . "\n"; 
} 

कहाँ

@files = <*>; 

हो सकता है

@files = </var/www/htdocs/*>; 
@files = </var/www/htdocs/*.html>; 

आदि

+0

में उपसर्ग कर सकते हैं यह जीएनयू/लिनक्स और शायद अन्य समान ऑपरेटिंग सिस्टम पर छिपी हुई फाइलों (डॉट से शुरू होने वाले) सूचीबद्ध नहीं करेगा। – josch

17

का आनंद लें।

opendir(DH, "directory"); 
my @files = readdir(DH); 
closedir(DH); 

foreach my $file (@files) 
{ 
    # skip . and .. 
    next if($file =~ /^\.$/); 
    next if($file =~ /^\.\.$/); 

    # $file is the file used on this iteration of the loop 
} 
+1

धन्यवाद! मैं 'अगली अगर ($ file = ~ /^.+$/) का उपयोग करूंगा; हालांकि, दूसरे कथन से बचने के लिए;)। – ashraf

+0

@ashraf regex /^.+$/ – Rauf

+0

@Rauf हाँ के बजाय /^\.+$/ होना चाहिए, मुझे लगता है कि आप सही हैं! :) – ashraf

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

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