2009-07-13 13 views
5

Estoy ejecutando la versión actual de ActivePerl en Windows Vista, y me preguntaba si podría mostrarme la mejor y más simple forma de copiar una carpeta y su contenido a otra ubicación. El contenido incluiría varios archivos, y probablemente algunas carpetas más anidadas.¿Cómo puedo copiar recursivamente los contenidos del directorio usando Perl?

Imagino que debe haber un módulo en alguna parte que no conozco que hace esto, pero si hay una solución tipo homebrew, me gustaría ver eso también.

Respuesta

14

Eche un vistazo a File::Copy::Recursive.

+0

Sin duda, no es tan simple como llamar dircopy()? – radicalmatt

+0

No, es _exactamente_ así de simple. Instalar File :: Copy :: Recursive; leer sus documentos; importarlo en tu script; usarlo CPAN es la aplicación asesina de Perl. – Telemachus

+6

En realidad, otras dos cosas. En primer lugar, con el interés de aprender más, siempre puede leer la fuente del módulo que utiliza, para ver cómo el autor hace las cosas. Segundo, deja de llamarme Shirley. – Telemachus

0

Si simplemente está copiando y sin hacer ningún procesamiento en los archivos, no hay razón para no usar xcopy.

Ahora, escribí el guión a continuación a la luz de los comentarios de Telemachus para proporcionarle un punto de partida. Personalmente me quedaría con xcopy para copiar y File::Find si el contenido del archivo necesita ser procesado. Además, estoy seguro de que hay alrededor de 37 errores en el código a continuación. Pero, si quieres jugar un poco, podría ser instructivo:

#!/usr/bin/perl 

use strict; 
use warnings; 

use File::Spec::Functions qw(catfile); 

die "mydeepcp src-dir target-dir\n" unless @ARGV == 2; 

my ($src, $target) = @ARGV; 
mydeepcp($src => $target); 

sub mydeepcp { 
    my ($src, $target) = @_; 

    opendir my $dir_h, $src 
     or die "Cannot open directory: '$src': $!"; 

    while (my $file = readdir $dir_h) { 
     next if $file =~ m{^\.\.?$}; 
     my $src_path = catfile $src => $file; 
     my $target_path = catfile $target => $file; 

     if (-d $src_path) { 
      # FIXME: insert code somewhere to create destination dir 
      mydeepcp($src_path => $target_path); 
     } 
     elsif (-f _) { 
      if (my $err = docp($src_path => $target_path)) { 
       warn sprintf(
        "Error copying '%s' from '%s' to '%s': %s\n", 
        $file, $src, $target, $err 
       ); 
      } 
     } 
     else { 
      warn "Skipping '$src_path'\n"; 
     } 
    } 

    closedir $dir_h; 
    return; 
} 

sub docp { 
    my ($src, $target) = @_; 
    warn "'$src' => '$target'\n"; 
    return; 
} 

__END__ 

Salida:

C:\Temp> ghj c:\windows f:\qwert 
... 
'C:\windows\$hf_mig$\KB899591\update\spcustom.dll' => 'F:\qwert\$hf_mig$\KB899591\update\spcustom.dll' 
'C:\windows\$hf_mig$\KB899591\update\update.exe' => 'F:\qwert\$hf_mig$\KB899591\update\update.exe' 
'C:\windows\$hf_mig$\KB899591\update\update.ver' => 'F:\qwert\$hf_mig$\KB899591\update\update.ver' 
+0

Supongo que el objetivo es principalmente aprender más sobre Perl en lugar de solo copiar esos archivos. – Telemachus

+0

@Telemachus: En ese caso, recomendaría escribir un programa usando File :: Find que invoca el comando de copia del sistema operativo en cada archivo. Véase también http://www.perlmonks.org/?node_id=295656 –

+0

Lo suficientemente, quizás, pero File :: Find no es un módulo fácil para principiantes, y obtener copias recursivas de archivos y directorios directamente tampoco es una tarea fácil. No digo que sea un mal ejercicio, solo que no es fácil. – Telemachus

Cuestiones relacionadas