如何使用Perl复制特定类型的所有文件?
现在,我用的是如何使用Perl复制特定类型的所有文件?,perl,file,copy,Perl,File,Copy,现在,我用的是 copy catfile($PATH1, "instructions.txt"), catfile($ENV{'DIRWORK'}); 分别用于我要复制的每个.txt文件。此代码是可移植的,因为它不使用任何特定于操作系统的命令 当我不知道所有文件的单独名称时,如何将所有文本文件从$PATH1复制到DIRWORK,同时保持代码的可移植性?如果保证在Unix系统上工作(例如,不关心可移植性),我将违背我自己通常的倾向和公认的最佳实践,建议考虑使用“cp”: 对于Perl本机解决方案
copy catfile($PATH1, "instructions.txt"), catfile($ENV{'DIRWORK'});
分别用于我要复制的每个.txt
文件。此代码是可移植的,因为它不使用任何特定于操作系统的命令
当我不知道所有文件的单独名称时,如何将所有文本文件从
$PATH1
复制到DIRWORK
,同时保持代码的可移植性?如果保证在Unix系统上工作(例如,不关心可移植性),我将违背我自己通常的倾向和公认的最佳实践,建议考虑使用“cp”:
对于Perl本机解决方案,将全局文件列表(或file::Find)与查找实际文件名的功能结合起来
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 "$!";
}
您可以像这样使用核心模块:
use File::Copy;
my @files = glob("$PATH1/*.txt");
for my $file (@files) {
copy($file, $ENV{DIRWORK}) or die "Copy failed: $!";
}
使用core和,假设您希望将$PATH1
中的所有.txt
文件复制到$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 );
文件::查找和文件::复制是可移植的:
use File::Find;
use File::Copy;
find(
sub {
return unless ( -f $_ );
$_ =~ /\.txt$/ && copy( $File::Find::name, $ENV{'DIRWORK'} );
},
$PATH1
);
由于您提到的原因,无法使用
cp
。
也是一个glob;)代码开头不应该有一个“use File::Copy;”吗?
use File::Find;
use File::Copy;
find(
sub {
return unless ( -f $_ );
$_ =~ /\.txt$/ && copy( $File::Find::name, $ENV{'DIRWORK'} );
},
$PATH1
);