¿Cuál es la mejor manera en Perl de copiar archivos en un árbol de directorios aún por crear?
Pregunta
¿Cuál es la mejor manera en Perl de copiar archivos en un árbol de directorios de destino que aún no se ha creado?
Algo como
copy("test.txt","tardir/dest1/dest2/text.txt");
no funcionará ya que el directorio tardir / dest1 / dest2 aún no existe. ¿Cuál es la mejor manera de copiar con la creación de directorios en Perl?
Solución
use File::Path;
use File::Copy;
my $path = "tardir/dest1/dest2/";
my $file = "test.txt";
if (! -d $path)
{
my $dirs = eval { mkpath($path) };
die "Failed to create $path: $@\n" unless $dirs;
}
copy($file,$path) or die "Failed to copy $file: $!\n";
Otros consejos
use File::Basename qw/dirname/;
use File::Copy;
sub mkdir_recursive {
my $path = shift;
mkdir_recursive(dirname($path)) if not -d dirname($path);
mkdir $path or die "Could not make dir $path: $!" if not -d $path;
return;
}
sub mkdir_and_copy {
my ($from, $to) = @_;
mkdir_recursive(dirname($to));
copy($from, $to) or die "Couldn't copy: $!";
return;
}
File :: Copy :: Recursive :: fcopy ( ) es no básico pero combina la solución File :: Path :: mkpath () y File :: Copy :: copy () en algo aún más corto, y conserva los permisos a diferencia de File :: Copy. También contiene otras funciones de utilidad ingeniosas.
Vea las otras respuestas para hacer la copia, pero para crear el directorio Path :: Class es muy agradable de usar:
use Path::Class;
my $destination_file = file('tardir/dest1/dest2/test.txt');
$destination_file->dir->mkpath;
# ... do the copying here
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow