2008-10-15 15 views
16

मैं पर्ल में वर्तमान निर्देशिका की सभी उप-निर्देशिकाओं के माध्यम से पार करने की कोशिश कर रहा हूं, और उन फ़ाइलों से डेटा प्राप्त कर रहा हूं। मैं दिए गए निर्देशिका में सभी फाइलों और फ़ोल्डरों की एक सूची प्राप्त करने के लिए grep का उपयोग कर रहा हूं, लेकिन मुझे नहीं पता कि कौन से मान लौटाए गए फ़ोल्डर का नाम है और जो फ़ाइल फ़ाइल एक्सटेंशन के साथ एक फ़ाइल है।मैं पर्ल में निर्देशिका से फ़ाइल को कैसे अलग करूं?

मैं अंतर कैसे बता सकता हूं?

उत्तर

27

पर आप अगर कुछ एक निर्देशिका है जांच करने के लिए एक -d फ़ाइल परीक्षण ऑपरेटर का उपयोग कर सकते है। यहाँ

 
    -e File exists. 
    -z File has zero size (is empty). 
    -s File has nonzero size (returns size in bytes). 
    -f File is a plain file. 
    -d File is a directory. 
    -l File is a symbolic link. 

इसके अलावा perlfunc manual page for more

देखें, File::Find जो आपके लिए निर्देशिका recurse कर सकते हैं का उपयोग करके देखें सामान्यतः उपयोगी फ़ाइल परीक्षण ऑपरेटरों में से कुछ है। यहां एक नमूना है जो निर्देशिकाओं के लिए लग रहा है ....

sub wanted { 
    if (-d) { 
     print $File::Find::name." is a directory\n"; 
    } 
} 

find(\&wanted, $mydir); 
20
print "$file is a directory\n" if (-d $file); 
+0

इस खूबसूरती से काम किया है, धन्यवाद –

+1

फ़ाइल परीक्षण कार्यों के सभी के लिए प्रलेखन "perldoc -f -X" के साथ पाया जा सकता है (जो सुंदर है अनजान, मैं स्वीकार करूंगा)। –

4
 
my $dh = opendir("."); 
my @entries = grep !/^\.\.?$/, readdir($dh); 
closedir $dh; 

foreach my $entry (@entries) { 
    if(-f $entry) { 
     # $entry is a file 
    } elsif (-d $entry) { 
     # $entry is a directory 
    } 
} 
2

यह File::Find उपयोग करने के लिए आसान होगा। -X ऑपरेटरों पर

9

देखो:

perldoc -f -X 

निर्देशिका ट्रावर्सल के लिए, उपयोग फ़ाइल :: खोजें, या, यदि आप एक masochist नहीं कर रहे हैं, मेरी फाइल :: अगला मॉड्यूल जिसके लिए एक इटरेटर बनाता का उपयोग आप और पागल कॉलबैक की आवश्यकता नहीं है। वास्तव में, आपके पास फ़ाइल :: अगला केवल फ़ाइलें लौटा सकती है, और निर्देशिकाओं को अनदेखा कर सकती है।

use File::Next; 

my $iterator = File::Next::files('/tmp'); 

while (defined (my $file = $iterator->())) { 
    print $file, "\n"; 
} 

# Prints... 
/tmp/foo.txt 
/tmp/bar.pl 
/tmp/baz/1 
/tmp/baz/2.txt 
/tmp/baz/wango/tango/purple.txt 

यह http://metacpan.org/pod/File::Next

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