readdir / File :: Find :: Rule未读取perl中的子目录及其内容

时间:2018-07-29 20:53:44

标签: linux perl suse

我尝试了3种不同的方法来读取文件夹的内容,但它们都无法识别设置中的子目录。

奇怪的是,当我在本地重新创建文件夹结构时,会识别出该子目录,并且获得了所有3种解决方案都在寻找的文件。

此子目录与设置中文件夹中的其他文件一起动态创建。每次我都能读取所有创建的文件,但不能读取子目录及其内容。

我尝试了以下解决方案。

解决方案1:

use File::Find::Rule;

my $dir = '.';
my @subdirs = File::Find::Rule->directory->in($dir);
foreach (@subdirs) {
  print "Dir --> $_ \n";
}

my @list = ("*.txt", "*.rex");
my @files = File::Find::Rule->file()->name(@list)->in(@subdirs);

foreach (@files) {
  print "File --> $_ \n";
}

->不列出子目录。子目录包含我要查找的文件。所以我没有得到文件。

解决方案1的变体,它直接在文件夹中查找。

my $dir = getcwd();
my @types = ("*.txt","*.rex");
my @files = File::Find::Rule->file()->name(@types)->in("$dir");

print join("\n", @files);

这也不会打印文件,因为我看不到它会检查包含文件的子目录。

解决方案2:

my $cwd = getcwd();

sub find_rex {
    my $f = $File::Find::name;

    if ($f =~ /rex$/){
     print "$f \n";
    }
}

find (\&find_rex, $cwd);

解决方案3:

my @dirlist = '.'; # current dir, or command line arguments
foreach (@dirlist) { &check_dir($_); }
exit 0;

sub check_dir {
  my $dir=shift;
  print "Dir to search --> $dir \n";

  warn "cannot traverse directory $dir\n"
    unless (opendir D,$dir);
  my @files = map {$dir.'/'.$_} grep {!m/^\.{1,2}$/} readdir D;
  closedir D;


  foreach (@files) {
    if (-d $_) { 
                 &check_dir($_);
    }
    elsif (-f $_) { 
                   if ($_ =~ /\.rex$/ ){
                     print "Filename --> $_ \n";
                  }
    }
}

}

所有这些解决方案都对我有效,以获取子目录的内容。我确保子目录在本地也具有相同的权限来测试我的代码。解决方案在本地可用,但在实际设置中不起作用。

我的想法已经用完了。当我在linux中列出子文件夹及其中的文件时,我能够看到它们。我也尝试过该glob,但它也不起作用。

更多详细信息:操作系统:Suse Linux,Bash / TCSH shell

谁能建议我可以尝试的东西。我不确定是否是readdir问题或其他问题。

有人遇到这种奇怪的问题。我可能做错了什么? 请建议我可以做什么?

无法识别的子文件夹是这样的 2018-07-29T22.57.52

此文件夹包含我要查找的文件,Perl模块的Find和readdir似乎没有检查该文件。

如果需要重新表达我的问题,请告诉我。

0 个答案:

没有答案