如何将整个目录复制到perl脚本中的特定文件夹
How to copy whole directory to perticular folder in perl script
我正在尝试通过匹配名称将存储在一个目录中的压缩文件复制到另一个文件夹。
下图是我的程序输入的文件夹名称。
从这个列表中我只使用 "Sample_51" 文件夹,在这个文件夹中我有如下压缩文件,
现在我需要将所有 "R1" 命名文件复制到 R1 文件夹,并将所有 "R2" 命名文件复制到 R2 文件夹。
下面我已经尝试这样做了,帮我按照上面的解释去做,
#! use/bin/perl
print "Enter Folder name \n";
print "File name: ";
chomp( my $Filename = <> );
system("mkdir R1");
system("mkdir R2");
opendir( DIR, "$Filename" ) or die "cannot open directory";
foreach my $name ( readdir(DIR) ) {
next if ( $name =~ /^\./ );
next if ( $name =~ /^\.\./ );
if ( $Filename =~ /\S+(R\d)/ ) {
system("cp -r $Filename R1");
}
else {
system("cp -r $Filename R2");
}
}
复制这个之后还有一步,我会在解决这个问题后更新,
提前致谢
我认为你的问题是这一行:
if ( $Filename =~ /\S+(R\d)/ ) {
因为它匹配的是 R
后跟任何数字。对于名为 R1
、R2
、R9
或 R99999
的文件也是如此
您需要捕获该正则表达式匹配的结果。 (顺便说一句 - 未锚定的 \S+
在这个例子中也不会做太多。这只是意味着 'one or more non spaces' 在 R 之前。
怎么样:
if ( my ( $R_Num ) = ( $Filename =~ /_(R\d+)_/ ) {
print "R number is $R_Num\n";
}
因为这样您就可以根据设置的内容进行工作(如果匹配失败,if
将测试为 false)。
使用File::Copy
复制文件。正如@sobrique 所说 $Filename =~ /\S+(R\d)
它匹配任何数字后跟 R.But 我猜你只对 R1
和 R2
感兴趣。试试这个:
#!/usr/bin/perl
use File::Copy;
use strict;
use warnings;
print"Enter Folder name \n";
print"File name: ";
chomp(my $Filename=<>);
mkdir "R1";
mkdir "R2";
opendir(DIR,"$Filename") or die "cannot open directory";
foreach my $name (readdir(DIR))
{
next if ($name =~ /^\./);
if($name =~ /R1/) { #compare $name not $Filename
copy("$Filename/$name", "R1"); # copy the file from folder to R1 directory
}
elsif($name =~ /R2/){
copy("$Filename/$name","R2"); ## copy the file from folder to R2 directory
}
}
我正在尝试通过匹配名称将存储在一个目录中的压缩文件复制到另一个文件夹。
下图是我的程序输入的文件夹名称。
从这个列表中我只使用 "Sample_51" 文件夹,在这个文件夹中我有如下压缩文件,
下面我已经尝试这样做了,帮我按照上面的解释去做,
#! use/bin/perl
print "Enter Folder name \n";
print "File name: ";
chomp( my $Filename = <> );
system("mkdir R1");
system("mkdir R2");
opendir( DIR, "$Filename" ) or die "cannot open directory";
foreach my $name ( readdir(DIR) ) {
next if ( $name =~ /^\./ );
next if ( $name =~ /^\.\./ );
if ( $Filename =~ /\S+(R\d)/ ) {
system("cp -r $Filename R1");
}
else {
system("cp -r $Filename R2");
}
}
复制这个之后还有一步,我会在解决这个问题后更新,
提前致谢
我认为你的问题是这一行:
if ( $Filename =~ /\S+(R\d)/ ) {
因为它匹配的是 R
后跟任何数字。对于名为 R1
、R2
、R9
或 R99999
您需要捕获该正则表达式匹配的结果。 (顺便说一句 - 未锚定的 \S+
在这个例子中也不会做太多。这只是意味着 'one or more non spaces' 在 R 之前。
怎么样:
if ( my ( $R_Num ) = ( $Filename =~ /_(R\d+)_/ ) {
print "R number is $R_Num\n";
}
因为这样您就可以根据设置的内容进行工作(如果匹配失败,if
将测试为 false)。
使用File::Copy
复制文件。正如@sobrique 所说 $Filename =~ /\S+(R\d)
它匹配任何数字后跟 R.But 我猜你只对 R1
和 R2
感兴趣。试试这个:
#!/usr/bin/perl
use File::Copy;
use strict;
use warnings;
print"Enter Folder name \n";
print"File name: ";
chomp(my $Filename=<>);
mkdir "R1";
mkdir "R2";
opendir(DIR,"$Filename") or die "cannot open directory";
foreach my $name (readdir(DIR))
{
next if ($name =~ /^\./);
if($name =~ /R1/) { #compare $name not $Filename
copy("$Filename/$name", "R1"); # copy the file from folder to R1 directory
}
elsif($name =~ /R2/){
copy("$Filename/$name","R2"); ## copy the file from folder to R2 directory
}
}