Perl перебирает каталоги - PullRequest
8 голосов
/ 22 июня 2011

Я пытаюсь получить имя всех каталогов по указанному пути

Я пробовал следующее, но это дает мне каждый уровень вниз не только по указанному мной пути

find(\&dir_names, "C:\\mydata\\");
sub dir_names {
    print "$File::Find::dir\n" if(-f $File::Find::dir,'/');
}

Ответы [ 4 ]

17 голосов
/ 22 июня 2011
my @dirs = grep { -d } glob 'C:\mydata\*';
6 голосов
/ 22 июня 2011

Используйте opendir вместо

opendir DIR, $dirname or die "Couldn't open dir '$dirname': $!";
my @files = readdir(DIR); 
closedir DIR; 
#next processing... 

EDIT:

"Это даст все файлы, а не только каталоги. Вам все равно придется выполнить grep."

Да, и в этом случае вы можете просто использовать оператор проверки файлов, чтобы увидеть, является ли это каталогом или нет.

В Windows:

$dirname="C:\\";
opendir(DIR, $dirname);
@files = readdir(DIR);
closedir DIR;
foreach $key (@files)
 {
  if(-d "$dirname\\$key")
   {
     print "$key\n";
   }
 } 
1 голос
/ 22 июня 2011

См. Главу 2 Файловые системы из Автоматизация системного администрирования с 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.
        }
    }
}
0 голосов
/ 22 июня 2011

glob или readdir, вероятно, тоже будет моим выбором.Другой способ сделать это - использовать команду windows dir для выполнения работы:

my @dirs = qx(dir /AD /B);
chomp @dirs;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...