2017-01-12 4 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 
} 

И последнее:

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, вы можете использовать File :: Find, который имеет простой учебник here.

+0

https://metacpan.org/pod/File::Copy#RETURN * Все функции возвращают 1 на успех, 0 при ошибке. $! будет установлен, если возникла ошибка. * – melpomene

+0

Я только что изменил, спасибо :) – carlosn

Смежные вопросы