-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::Classまたはを使用する必要がありますFile::Spec。しかし、注意して移植性を気にしないのであれば、

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

    十分かもしれません。

このcopy関数は、ファイルとターゲット ディレクトリではなく、 2 つのファイル名を取ります。そして、エラーチェックを実行する必要があります:

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 に答える