我試圖在指定的路徑來獲取所有目錄的名稱perl的遍歷目錄
我嘗試以下,但,讓我每級下調不只是在我指定的
find(\&dir_names, "C:\\mydata\\");
sub dir_names {
print "$File::Find::dir\n" if(-f $File::Find::dir,'/');
}
我試圖在指定的路徑來獲取所有目錄的名稱perl的遍歷目錄
我嘗試以下,但,讓我每級下調不只是在我指定的
find(\&dir_names, "C:\\mydata\\");
sub dir_names {
print "$File::Find::dir\n" if(-f $File::Find::dir,'/');
}
my @dirs = grep { -d } glob 'C:\mydata\*';
非常感謝FMc,就像一個魅力!請你解釋一下-d是什麼,我知道grep和global,但是不能弄清楚{-d}做了什麼。謝謝 –
@ParikshitTiwari它將glob的結果過濾爲只是目錄。它是許多文件測試運營商之一:請參閱http://perldoc.perl.org/functions/-X.html。 – FMc
使用opendir
代替
opendir DIR, $dirname or die "Couldn't open dir '$dirname': $!";
my @files = readdir(DIR);
closedir DIR;
#next processing...
編輯:
「這將給所有的文件,而不僅僅是目錄。你仍然需要grep的「
是的,在這種情況下,你可以使用文件測試操作,看它是否是一個目錄或不
在Windows中:。
$dirname="C:\\";
opendir(DIR, $dirname);
@files = readdir(DIR);
closedir DIR;
foreach $key (@files)
{
if(-d "$dirname\\$key")
{
print "$key\n";
}
}
glob
或readdir
可能會是我的選擇太另一種方法是使用Windows dir
命令來完成這項工作。
my @dirs = qx(dir /AD /B);
chomp @dirs;
請參閱第2章文件系統從Automating System Administration with Perl。這爲我們提供了:
sub ScanDirectory{
my ($workdir) = shift;
chdir($workdir) or die "Unable to enter dir $workdir:$!\n";
opendir(DIR, ".") or die "Unable to open $workdir:$!\n";
my @names = readdir(DIR) or die "Unable to read $workdir:$!\n";
closedir(DIR);
foreach my $name (@names){
next if ($name eq ".");
next if ($name eq "..");
if (-d $name){ # is this a directory?
#Whatever you want to do goes here.
}
}
}
「每層下來」聽起來都像你在標題中所要求的:「遍歷目錄」。 – TLP