Как проверить в Perl, существует ли какая-либо подпапка в папке? - PullRequest
1 голос
/ 15 марта 2011

Есть ли способ проверить, существует ли какая-либо подпапка в папке. Я хотел бы сделать это в Perl?

Ответы [ 7 ]

3 голосов
/ 15 марта 2011
if (grep -d, glob("$folder/*")) {
    print "$folder has subfolder(s)\n";
}  

Если вы хотите иметь дело с каталогами, соответствующими .*, вы можете сделать:

if (grep -d && !/\.\.?$/, glob("$folder/.* $folder/*")) {
    print "$folder has subfolder(s)\n";
}  
3 голосов
/ 15 марта 2011

Просмотрите содержимое каталога и проверьте, является ли он каталогом с -d.

sub has_subfolder {
  my $directory = shift;
  for ( <$directory/*>, <$directory/.*> ) {
    next if m@/\.\.?$@; # skip . and ..
    return 1 if -d;
  }
  return 0;
}
1 голос
/ 16 марта 2011

Для этой цели вы можете использовать модуль 'File :: Find'.File :: Find обрабатывает и просматривает каталог рекурсивно.Вот пример кода:

use File::Find;
my $DirName = 'dirname' ;

sub has_subdir 
{
    #The path of the file/dir being visited.
    my $subdir = $File::Find::name;

    #Ignore if this is a file.
    return unless -d $subdir;

    #Ignore if $subdir is $Dirname itself.
    return if ( $subdir eq $DirName);

    # if we have reached here, this is a subdirector.
    print "Sub directory found - $subdir\n";
}

#For each file and sub directory in $Dirname, 'find' calls 
#the 'has_subdir' subroutine recursively.
find (\&has_subdir, $DirName);
1 голос
/ 15 марта 2011

ОК, я просто должен представить свой ответ

sub has_subfolder {
  my $dir = shift;
  my $found = 0;
  opendir my $dh, $dir or die "Could not open directory $dir: $!";
  while (my $_ = readdir($dh)) {
    next if (/^\.\.?$/);        # skip '.' and '..'
    my $path = $dir . '/' . $_; # readdir doesn't return the whole path
    if (-d $path) {             # found a dir?  record it, and leave the loop!   
      $found = 1;
      last;    
  }
  closedir($dh);                # make sure we cleanup after!
  return $found;
}

По сравнению с другими ответами:

  • находит скрытые каталоги
  • завершается, как только находит совпадение
  • не пересекает дерево дважды (один раз для обычных файлов и снова для скрытых файлов)

РЕДАКТИРОВАТЬ - Я вижу, что требования только что изменились (вздох). К счастью, приведенный выше код тривиально изменен:

sub get_folders {
  my $dir = shift;
  my @found;
  opendir my $dh, $dir or die "Could not open directory $dir: $!";
  while (my $_ = readdir($dh)) {
    next if (/^\.\.?$/);           # skip '.' and '..'
    my $path = $dir . '/' . $_;    # readdir doesn't return the whole path
    push(@found, $_) if (-d $path) # found a dir? record it 
  }
  closedir($dh);                   # make sure we cleanup after!
  return @found;
}
1 голос
/ 15 марта 2011

Чтобы проверить, существует ли подпапка в каталоге (не зная никаких имен):

my $dir_name = "some_directory";
opendir my $dir, $dir_name
    or die "Could not open directory $dir_name: $!";

my $has_subfolder = grep { -d && !/(^|\/)\.\.?$/ } map { ("$dir_name"||'.')."/$_" } readdir $dir;

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

Если вы хотите определенную подпапку, просто используйте ответ Geo.

Редактировать: Сейчас это становится глупо, но вот действительно универсальный ответ. :-P Кто-то еще получает галочку в любом случае.

1 голос
/ 15 марта 2011
sub hasSubDir {
    my $dir_name = shift;
    opendir my $dir, $dir_name
      or die "Could not open directory $dir_name: $!";
    my @files = readdir($dir);
    closedir($dir);
    for my $file (@files) {
       if($file !~ /\.\.?$/) {
           return 1 if -d $dir/$file;
       }
    }
    return 0;
}
0 голосов
/ 15 марта 2011
if(-e "some_folder/some_subfolder") {
   print "folder exists";
}
else {
   print "folder does not exist";
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...