复制目录及其所有内容功能?

时间:2016-06-24 15:19:46

标签: perl copy

首先,我知道有一个库File :: Copy :: Recursive,它具有等效的功能。不幸的是,我目前正在一个服务器上工作,我没有自由安装库,并说服那些不实用的人。

我正在尝试编写一个函数,它将目录的所有内容(包括子目录及其内容)复制到一个新的空目录中。这是我现在的完整代码:

#!/usr/bin/perl

use File::Copy;

# To use: rec_cpy (sourcedir, destdir)
sub rec_cpy {
  my $sourcedir = $_[0];
  my $destdir = $_[1];
  # open the directory
  opendir(DIR, $sourcedir) or die "Failed to open $sourcedir\n";
  my @files = readdir(DIR);
  closedir(DIR);
  # iterate over contents of directory
  foreach my $filename (@files) {
   if(-d $filename && $filename ne "." && $filename ne ".." ) {
    # if a subdirectory, make the directory and copy its contents
    mkdir "$destdir/$filename";
    rec_cpy("$sourcedir/$filename","$destdir/$filename");
    }
    else {
      # if anything else, copy it over
      copy ("$sourcedir/$filename","$destdir/$filename");
    }
  }
  return;
}

rec_cpy("test1", "test2");
mkdir "itried";

“test1”是一个包含文件和目录的目录,其中包含一个文件(所有文件都有唯一的名称)。 “test2”是一个空的但现存的目录。

当我运行这个时,我得到一个错误“'test1 / ..'和'test2 / ..'在rec_cpy.pl第26行是相同的(没有复制),”这是有意义的(因为它们都已经存在并且已经有“......”了。但是,当我打开test2时,test1中的目录被复制为一个目录,而不是一个文件,但是“itried”被创建为一个没有问题的目录。发生了什么事?

1 个答案:

答案 0 :(得分:1)

你刚犯了两个错误:

  • 如果此测试(-d $filename && $filename ne "." && $filename ne ".." )失败,则表示$filename不是目录它""。"或" .."。你忘记了最后的可能性。纠正此问题的方法是在测试$filename ne "." && $filename ne ".."后放置-d $filename(请参阅下面的代码)。
  • 您需要检查"$sourcedir/$filename"是否为目录,而不仅仅是$filename

所以修正了这两个问题的foreach循环:

foreach my $filename (@files) {
    if(-d "$sourcedir/$filename") {
        if ($filename ne "." && $filename ne ".." ) {
            # if a subdirectory, make the directory and copy its contents
            mkdir "$destdir/$filename"; exit;
            rec_cpy("$sourcedir/$filename","$destdir/$filename");
        }
    }
    else {
        # if anything else, copy it over
        copy ("$sourcedir/$filename","$destdir/$filename");
    }
}

<小时/> 但正如@oldtechaa所提到的,你可以在你的项目中包含File :: Copy :: Recursive的代码。