Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用Perl复制特定类型的所有文件?_Perl_File_Copy - Fatal编程技术网

如何使用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
);