2010-10-28 8 views
4

En ce moment, je me sers quelque chose commeComment copier tous les fichiers d'un type particulier en utilisant Perl?

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

individuellement pour chacun des fichiers .txt que je veux copier. Ce code est portable car il n'utilise aucune commande spécifique au système d'exploitation.

Comment puis-je copier tous les fichiers texte $PATH1-DIRWORK, quand je ne connais pas les noms individuels de tous les fichiers, tout en gardant le code portable?

+0

Ne devrait pas y avoir un "fichier utilisation :: Copie;" au début du code? –

Répondre

7

Vous pouvez utiliser le module noyau File::Copy comme celui-ci:

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

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

'<$ PATH1/*. Txt>' est aussi un glob;) – mfontani

0

Si vous êtes assuré de travailler sur un système Unix (par exemple, ne se soucient pas de la portabilité), je vais aller contre mes propres inclinations habituelles et accepté les meilleures pratiques et recommande d'envisager l'utilisation « cp » :)

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

pour la solution native Perl, combiner la liste des fichiers globbed (ou file :: Find) avec File::Spec capacité à trouver le nom de fichier réel

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

ne peut pas utiliser 'cp' pour la raison que vous avez mentionné - portabilité. – Lazer

2

En utilisant coeur File::Find et File::Copy et en supposant que vous voulez tous .txt les fichiers copiés sur $PATH1$ENV{DIRWORK} et également en supposant que vous voulez qu'il récursion ...

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); 

donner un aller;)

Sinon, pourquoi n'utilisez-vous pas bash?

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

File :: Find et File :: Copy sont portables:

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

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