2008-10-15 73 views
16

我想遍歷Perl中當前目錄的所有子目錄,並從這些文件中獲取數據。我正在使用grep來獲取給定目錄中所有文件和文件夾的列表,但我不知道返回的哪些值是文件夾名稱,哪些是沒有文件擴展名的文件。如何區分Perl中的文件和目錄?

我該如何區分?

回答

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可以遞歸目錄爲您服務。下面是它看起來的目錄樣本....

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

這美麗的工作,感謝 – 2008-10-15 22:39:34

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

9

看的-X運營商:

perldoc -f -X 

對於目錄遍歷,使用文件::查找,或者,如果你不是一個受虐狂,用我的文件::下一個模塊,這使得一個迭代器你並不需要瘋狂的回調。事實上,你可以讓File :: Next只返回文件,而忽略目錄。

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

5
my @files = grep { -f } @all; 
my @dirs = grep { -d } @all; 
相關問題