2014-10-23 2 views
1

Я хочу скопировать некоторые конкретные файлы из папки в другую папку. Исходной папки, имеющие эти типы файлов:Соответствие шаблону не работает при копировании файлов

Пример:

abc_key_in.rsb 
abc_key_in_at.rsb 
abc_key_in.kwd 
abc_key_in_at.kwd... 

Я должен копировать файлы, которые имеющие abc_key_ в качестве префикса и .kwd как расширение ....

Я пытался этот код, но соответствие шаблонов не работает ...

foreach $filename(@files) 
{ 

    if($file_name =~/abc_key_*.kwd/) <--- Not working 
    { 
     print $file_name; 
     cp($file_name,$dest_dir.$file_name) #or die "Failed to copy $file_name :$!\n"; 
    } 
} 

ответ

1

Возможно, вы захотите ознакомиться с регулярными выражениями и совпадением рисунков, b потому что вы не используете правильный синтаксис. Попробуйте так:

if ($file_name =~ /^abc_key_.*\.kwd$/) { 
    # ... 
} 

мета-символы, используемые в регулярном выражении:

  • ^ обозначает начало строки
  • . является символ подстановки
  • * - квантификатор (0 и более)
  • \. буквальный символ точки
    (нужно бежать точку, потому что в противном случае она будет интерпретироваться как групповой символ)
  • $ обозначает конец строки
1

Вы можете используйте File::Find, чтобы найти файлы и File::Copy, чтобы скопировать их, например:

#!/usr/bin/perl 

use strict; 
use warnings; 

use File::Find; 
use File::Copy; 
use File::Path qw(make_path); 
use File::Spec::Functions qw(rel2abs); 

my $src = rel2abs('src'); 
my $dest = rel2abs('dest'); 

# create destination directory 
make_path("$dest"); 

# find and copy files 
find(\&wanted, $src); 

sub wanted { 
    if (m/^abc_key_.*\.kwb$/) { 
     copy($File::Find::name, $dest) or die "Copy failed: $!"; 
    } 
} 
0
^abc_key_[^.]*\.kwd$ 

Попробуйте следующее Это будет соответствовать только файлам, требующим ваших потребностей. См. Демонстрационную версию.

http://regex101.com/r/aX5eP7/2

1

Использование * напоминает маски оболочки, а не регулярные выражения.

Чтобы сделать это, вы хотите glob:

use strict; 
use warnings; 

use File::Copy; 

my $src_dir = '/foo/bar'; 
my $dest_dir = '/biz/baz'; 

for my $file (glob("$src_dir/abc_key_*.kwd")) { 
    copy($file, $dest_dir) or die "Can't copy $file to $dest_dir: $!"; 
} 

В качестве альтернативы, я бы рекомендовал использовать Path::Class для кросс платформенной совместимости файлов и каталогов обработки:

use strict; 
use warnings; 

use Path::Class; 

my $src_dir = dir('/foo/bar'); 
my $dest_dir = dir('/biz/baz'); 

for my $file ($src_dir->children) { 
    next if $file->is_dir || $file !~ /abc_key_.*\.kwd$/; 
    $file->copy_to($dest_dir) or die "Can't copy $file: $!"; 
} 
Смежные вопросы