2017-01-12 13 views
1

私は複数のディレクトリからファイルをコピーしようとしています。正しいパスとファイルが出力されますが、コピーは失敗します。この問題を解決する方法をお勧めしますか?あなたはもうそれを使用していない場合Perlがあるディレクトリから別のディレクトリにファイルをコピーしています

あなたのファイルを閉じて、できるだけ早く処理します:おかげ

#!/usr/bin/perl 

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

my $target_dir = ""; 

my @dirs = grep { -d } glob '/data/results/*'; 

for my $source_dir (@dirs) { 

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

    print "the directory is $source_dir\n"; 
    my $run_folder = (split '/', $source_dir)[3]; 
    print "the folder is $run_folder\n"; 

    $target_dir = "/data/backup/$run_folder"; 
    print $target_dir; 

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

     copy "$source_dir/$t", "$target_dir/$t"; 
     } 
    } 

    closedir($DIR); 

} 
+5

'copy" $ source_dir/$ t "、" $ target_dir/$ t "またはdie $ !;" – toolic

+2

"/ data/backup/$ run_folder"はファイルシステムのルートからの相対パスです。代わりに現在のディレクトリに相対的にすることを意味しましたか?おそらくファイルシステムのルートにコピーするには特権が必要です。 –

+0

Perlはディレクトリが存在しない場合は自動的に作成されると思っていましたが、間違っていました。 'mkdir $ target_dir;'を追加して修正しました。 – user3781528

答えて

0

は、私はあなたがする推薦がいくつかあります

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

あなたがいるといくつかのファイルとディレクトリをバックアップしようとすると、ターゲットの宛先にディレクトリが存在しない可能性があります:

$target_dir = "/data/backup/$run_folder"; 
print $target_dir; 

if (! -d $target_dir) 
{ 
    #creates the dir 
} 

そして最後の1:

foreach my $t (@files) 
    { 
     chomp $t; # it removes any new line 
     if(-f "$source_dir/$t") { 
     #Check with -f only for files (no directories) 
     print "$source_dir/$t"; 
     print "$target_dir/$t"; 

     if (! copy "$source_dir/$t", "$target_dir/$t") 
     { 
      print "Some error: $!"; 
     } 


     } 
    } 

常にTIMTOWTD、あなたは::ファイルを使用して、簡単なチュートリアルhereを持っている見つけることができます。

+0

https://metacpan.org/pod/File::Copy#RETURN *すべての関数は、成功すると1を返し、失敗した場合は0を返します。 $!エラーが発生した場合に設定されます。* – melpomene

+0

私はただ変更しました。 – carlosn

関連する問題