我想遍歷Perl中當前目錄的所有子目錄,並從這些文件中獲取數據。我正在使用grep來獲取給定目錄中所有文件和文件夾的列表,但我不知道返回的哪些值是文件夾名稱,哪些是沒有文件擴展名的文件。如何區分Perl中的文件和目錄?
我該如何區分?
我想遍歷Perl中當前目錄的所有子目錄,並從這些文件中獲取數據。我正在使用grep來獲取給定目錄中所有文件和文件夾的列表,但我不知道返回的哪些值是文件夾名稱,哪些是沒有文件擴展名的文件。如何區分Perl中的文件和目錄?
我該如何區分?
您可以使用-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);
print "$file is a directory\n" if (-d $file);
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 } }
這將是更容易使用File::Find
。
看的-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
my @files = grep { -f } @all;
my @dirs = grep { -d } @all;
這美麗的工作,感謝 – 2008-10-15 22:39:34