首先,我知道有一个库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”被创建为一个没有问题的目录。发生了什么事?
答案 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的代码。