[D]perl一个-d的问题

时间:2022-10-02 12:17:08
脚本功能是这样的,遍历一个制定的目录下的所有子目录与文件,并显示出文件与目录名字。
但是问题是这样的当迭代函数copydir运行到第一个目录下的第二个目录if(-d $a)这个-d竟然把一个目录判断成了文件。这个到底是则么回事,我到底哪里写错了呀

测试目录为在E:\\项目补丁\\perl脚本\\目录操作\\1 下面建两个目录,在第一个目录下再建两个目录,程序遍历到第二个目录时就把这个目录看成了文件...

use strict;
use File::Copy;

my $source_dir = "E:\\项目补丁\\perl脚本\\目录操作\\1";
my $tar_dir = "E:\\项目补丁\\perl脚本\\目录操作\\abc123";
my @one_level;
my $count;

chdir $source_dir;
@one_level = <*>;
for $a (@one_level){
chdir $source_dir;
print "one_level.---$a\n";
&copydir($a);
}
print "copy files total are ->$count<- \n";
<>;

sub copydir
{
my $up_dir = shift @_;
chdir $up_dir;
my @mydir = <*>;
for $a (@mydir){
print "a = --$a\n";
if (-d $a){
print "dir_path:$a\n";
#mkdir "$tar_dir\\$a";
&copydir($a);
#print "a1 = --$a\n";
}else{
#copy("$a","$tar_dir\\$a");
print "file:$a\n";
#print "a2 = --$a\n";
}
}
}

-------------------------
Double行动:
原帖分数:40
加分:40

2 个解决方案

#1


因为你在用-d对第二个目录进行判断的时候,“当前目录”已经发生改变,并不是真正的当前目录。
假如目录结构是这样的:
---dir1
---dir2
   ---dir3
   ---dir4
当你对dir4进行-d判断时,实际的当前目录是...\dir2\dir3,而不是..\dir2
可以这样修改:
use strict;
use File::Copy;
use Cwd;     #####

my $source_dir = "E:\\项目补丁\\perl脚本\\目录操作\\1";
my $tar_dir = "E:\\项目补丁\\perl脚本\\目录操作\\abc123";
my @one_level;
my $count;

chdir $source_dir;
@one_level = <*>;
for $a (@one_level){
    chdir $source_dir;
    print "one_level.---$a\n";
    &copydir($a);
}
print "copy files total are ->$count<- \n";
<>;

sub copydir
{
    my $up_dir = shift @_;
    my $curdir;
    chdir $up_dir;
    my @mydir = <*>;
    for $a (@mydir){
    print "a = --$a\n";
        if (-d $a){
         $curdir=getcwd;                  ####
            print "dir_path:$a\n";
            #mkdir "$tar_dir\\$a";
            &copydir($a);
            chdir $curdir;                       ####
            #print "a1 = --$a\n";
        }else{
            #copy("$a","$tar_dir\\$a");
            print "file:$a\n";
            #print "a2 = --$a\n";
        }
    }
}

#2


刚刚接触perl,多谢指教!加了这几段代码后正常了

#1


因为你在用-d对第二个目录进行判断的时候,“当前目录”已经发生改变,并不是真正的当前目录。
假如目录结构是这样的:
---dir1
---dir2
   ---dir3
   ---dir4
当你对dir4进行-d判断时,实际的当前目录是...\dir2\dir3,而不是..\dir2
可以这样修改:
use strict;
use File::Copy;
use Cwd;     #####

my $source_dir = "E:\\项目补丁\\perl脚本\\目录操作\\1";
my $tar_dir = "E:\\项目补丁\\perl脚本\\目录操作\\abc123";
my @one_level;
my $count;

chdir $source_dir;
@one_level = <*>;
for $a (@one_level){
    chdir $source_dir;
    print "one_level.---$a\n";
    &copydir($a);
}
print "copy files total are ->$count<- \n";
<>;

sub copydir
{
    my $up_dir = shift @_;
    my $curdir;
    chdir $up_dir;
    my @mydir = <*>;
    for $a (@mydir){
    print "a = --$a\n";
        if (-d $a){
         $curdir=getcwd;                  ####
            print "dir_path:$a\n";
            #mkdir "$tar_dir\\$a";
            &copydir($a);
            chdir $curdir;                       ####
            #print "a1 = --$a\n";
        }else{
            #copy("$a","$tar_dir\\$a");
            print "file:$a\n";
            #print "a2 = --$a\n";
        }
    }
}

#2


刚刚接触perl,多谢指教!加了这几段代码后正常了