Как скопировать все файлы определенного типа, используя Perl? - PullRequest
4 голосов
/ 28 октября 2010

Сейчас я использую что-то вроде

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

отдельно для каждого из .txt файлов, которые я хочу скопировать.Этот код переносим, ​​поскольку он не использует никаких специфических для ОС команд.

Как скопировать все текстовые файлы из $PATH1 в DIRWORK, когда я не знаю человекаимена всех файлов, сохраняя код переносимым?

Ответы [ 4 ]

7 голосов
/ 28 октября 2010

Вы можете использовать модуль ядра File::Copy следующим образом:

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

for my $file (@files) {
    copy($file, $ENV{DIRWORK}) or die "Copy failed: $!";
}
2 голосов
/ 28 октября 2010

Использование ядра File :: Find и File :: 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 голосов
/ 13 марта 2015

File :: Find и File :: Copy являются переносимыми:

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

find(
    sub {
        return unless ( -f $_ );
        $_ =~ /\.txt$/ && copy( $File::Find::name, $ENV{'DIRWORK'} );
    },
    $PATH1
);
0 голосов
/ 28 октября 2010

Если вы гарантированно работаете в системе Unix (например, не заботитесь о переносимости), я буду идти против своих собственных привычек и рекомендаций и рекомендую использовать «cp»:)

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

Для нативного решения Perl объедините глобальный список файлов (или File :: Find) с возможностью 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 "$!";
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...