-7

请检查以下代码:

#!/usr/bin/perl -w
use Cwd;        
use warnings;    
use Net::FTP;    
use File::Copy;    
use File::Path;    
use Time::Local;     
use File::Basename;    
use strict;    
my $directory = "/media/Songs/Perl/test";    
my $path = "/media/Songs/Perl/test_sort";    
opendir(DIR,$directory);    
my @files = readdir(DIR);    
closedir(DIR);    
foreach my $t (@files)
{    
    copy($t,$path); //copying files
}
4

2 回答 2

8

这是我对您的代码的修订。

#!/usr/bin/env perl

use strict;
use warnings;
use File::Copy;

my $source_dir = "/media/Songs/Perl/test";
my $target_dir = "/media/Songs/Perl/test_sort";

opendir(my $DIR, $source_dir) || die "can't opendir $source_dir: $!";  
my @files = readdir($DIR);

foreach my $t (@files)
{
   if(-f "$source_dir/$t" ) {
      #Check with -f only for files (no directories)
      copy "$source_dir/$t", "$target_dir/$t";
   }
}

closedir($DIR);
于 2013-04-14T10:14:22.293 回答
5

readdir功能需要一些后期处理才能有用。它返回该目录中的所有条目,包括.(此目录)和..父目录。返回的字符串不是来自您的 $PWD 的完整路径。

  1. 过滤掉不需要的项目:正则表达式匹配父链接和自身链接

    my @files = grep !/\A\.\.?\z/, readdir DIR;
    

    或者只选择简单的-f文件(没有目录,也没有管道、套接字等有趣的东西……)

    my @files = grep -f "$directory/$_", readdir DIR;
    
  2. 制作绝对路径:

    真的,应该使用Path::Classor File::Spec。但是,如果您很小心,并且不关心可移植性,那么

    for my $file (@files) {
      my $source = "$directory/$file";
      ...;
    }
    

    可能已经足够好了。

copy函数采用两个文件名,而不是文件和目标目录。你应该执行错误检查:

for my $file (@files) {
  my $source = "$directory/$file";
  my $target = "$path/$file";
  copy $source => $target or warn "Copy of $file failed: $!";
}
于 2013-04-14T10:20:23.073 回答