#!/usr/bin/perl
use strict;
use warnings;
use autodie;
my $path = $ARGV[0];
die "Please specify which directory to search"
unless -d $path;
opendir( my $DIR, $path );
while ( my $entry = readdir $DIR ) {
next unless -d $path . '/' . $entry;
next if $entry eq '.' or $entry eq '..';
print "Found directory $entry\n";
}
closedir $DIR;
use File::Spec::Functions qw( catfile );
my ($path) = @ARGV;
opendir my $DIR, $path
or die "Cannot open directory: '$path': $!";
while ( my $entry = readdir $DIR ) {
next if $entry =~ /\A\.\.?\z/;
next unless -d catfile $path, $entry;
print $entry, "\n";
}
closedir $DIR;
#!/usr/bin/perl --
use strict;
use warnings;
use Shell::Command qw( rm_rf touch mkpath );
use autodie;
use File::Find::Rule;
Main(@ARGV);
exit(0);
sub Main{
use autodie;
my $dir = "tmp";
mkdir $dir;
#~ chdir $dir;
mkpath "$dir/a/b/c/d";
mkpath "$dir/as/b/c/d";
mkpath "$dir/ar/b/c/d";
print `tree`;
print "---\n";
print "$_\n"
for File::Find::Rule->new->maxdepth(1)->directory->in($dir);
print "---\n";
print "$_\n"
for grep -d, glob "$dir/*"; ## use forward slashes, See File::Glob
#~ chdir "..";
rm_rf $dir;
}
__END__
.
|-- test.pl
`-- tmp
|-- a
| `-- b
| `-- c
| `-- d
|-- ar
| `-- b
| `-- c
| `-- d
`-- as
`-- b
`-- c
`-- d
13 directories, 1 file
---
tmp
tmp/a
tmp/ar
tmp/as
---
tmp/a
tmp/ar
tmp/as
9条答案
按热度按时间vfh0ocws1#
使用
-d
文件检查运算符:wgeznvg72#
如果不需要遍历整个目录层次结构,File::Slurp比File::Find更容易使用。
如果您确实需要遍历层次结构,请查看CPAN以获得
File::Find
的更友好的替代方法。File::Find
的前端。File::Find
以及如何编写闭包。最后,本着TIMTOWTDI的精神,这里有一些快速和肮脏的东西:
whlutmcx3#
这对我很有效。
ekqde3dh4#
我在Windows XP下运行ActivePerl 5.10.1,如果我想获取根驱动器F下所有目录的名称,我将使用以下代码:
嗯,这通常工作,因为我的文件夹名称不包含点。否则它失败。
好吧,看起来即使我的方法对我的情况有效,人们还是会因为它有错误而投反对票,所以我必须使用正式的方法,-d标志来检查一个文件是否是目录:
升级代码:
qqrboqgw5#
使用
opendir
和-d
。k10s72fa6#
你可以使用find2perl把你的find命令翻译成perl。2更多信息请看perldocfind2perl。
maxdepth的解决方法:(参考自Randall)
代码:
输出
uqzxnwby7#
使用文件::查找::规则
或者使用文件::查找::规则前端查找规则
bgtovc5b8#
lmvvr0a89#
您可以使用File::Find进行查找。例如:
对于在
'.'
下找到的每个文件,这将调用wanted
子例程。在子例程中,您可以使用-d
来检查目录。File::Find:find
将下降到指定目录下的树中的所有子目录。