2010-10-28 53 views
4

現在,我使用類似如何使用Perl複製特定類型的所有文件?

copy catfile($PATH1, "instructions.txt"), catfile($ENV{'DIRWORK'}); 

單獨爲每個我想複製的.txt文件。該代碼是可移植的,因爲它不使用任何操作系統特定的命令。

我如何複製所有文本文件從$PATH1DIRWORK,當我不知道所有文件的個人的名字,同時保持代碼的可移植性?

+0

不應該有一個 「使用文件::複製;」在代碼的開頭? – 2014-01-09 08:53:37

回答

7

您可以使用核心File::Copy模塊是這樣的:

use File::Copy; 
my @files = glob("$PATH1/*.txt"); 

for my $file (@files) { 
    copy($file, $ENV{DIRWORK}) or die "Copy failed: $!"; 
} 
+1

'<$ PATH1/*。txt>'也是一個glob;) – mfontani 2010-10-28 16:12:15

0

如果要保證在Unix系統上工作(例如,不關心的可移植性),我會違揹我自己平常的傾向和公認的最佳實踐,並推薦使用「CP」考慮:)

system("cp $PATH1/*.txt $ENV{'DIRWORK'}"); 
# Add error checking and STDERR redirection! 

對於Perl的原生解決方案,結合匹配替換的文件列表(或者文件::查找)與File::Spec能力找到實際的文件名

my @files = glob("$PATH1/*.txt"); 
foreach my $file (@files) { 
    my ($volume,$directories,$filename) = File::Spec->splitpath($file); 
    copy($file, File::Spec->catfile($ENV{'DIRWORK'}, $filename) || die "$!"; 
} 
+0

因爲你提到的可移植性而不能使用'cp'。 – Lazer 2010-10-28 16:07:05

2

使用核心File::FindFile::Copy並假設你希望所有.txt文件$PATH1複製到$ENV{DIRWORK},並假設你希望它遞歸...

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

die "ENV variable DIRWORK isn't set\n" 
    unless defined $ENV{DIRWORK} and length $ENV{DIRWORK}; 
die "DIRWORK $ENV{DIRWORK} is not a directory\n" 
    unless -d $ENV{DIRWORK}; 

my $PATH1 = q{/path/to/wherever}; 
die "PATH1 is not a directory" unless -d $PATH1; 

find(sub{ 
    # $_ is just the filename, "test.txt" 
    # $File::Find::name is the full "/path/to/the/file/test.txt". 
    return if $_ !~ /\.txt$/i; 
    my $dest = "$ENV{DIRWORK}/$_"; 
    copy($File::Find::name, $dest) or do { 
     warn "Could not copy $File::Find::name, skipping\n"; 
     return; 
    } 
}, $PATH1); 

搏一搏;)

或者,您爲什麼不使用bash

$ (find $PATH1 -type f -name '*.txt' | xargs -I{} cp {} $DIRWORK); 
0

文件::查找和文件複製::是便攜式:

use File::Find; 
use File::Copy; 

find(
    sub { 
     return unless (-f $_); 
     $_ =~ /\.txt$/ && copy($File::Find::name, $ENV{'DIRWORK'}); 
    }, 
    $PATH1 
); 
相關問題