http://www.perlmonks.org?node_id=88098

blacksmith has asked for the wisdom of the Perl Monks concerning the following question:

What would be the most efficient and easiest way to copy a file from one location to 3 different locations. I noticed in the FAQ section, a question that asked about printing more than one file at once. Am I on the right track, and if so could someone elaborate on the methods included there. I appreciate the advice. Blacksmith.

Replies are listed 'Best First'.
Re: Copying a file to more than one separate directory and/or file
by stephen (Priest) on Jun 13, 2001 at 19:58 UTC
    Best way is to use File::Copy. The FAQ section you're referring to is dealing with tee-ing filehandles, so that anything one prints goes into three files (if I'm understanding which section you're talking about correctly). If you're simply copying files, it's easiest to simply copy the files. Using File::Copy, you could do something like:
    use strict; use File::Copy; my $source = 'src1'; foreach my $dest ( 'dest_1', 'dest_2', 'dest_3' ) { copy($source, $dest); }

    stephen

      Depending on the size of the file, you may exhaust the machine's memory allocated to disk buffering, which means that if you use File::Copy you will physically reread the same disk sectors over and over again. If this is true, the most effecient method of writing to multiple files would be to read a line, and write it out to all the output files. Something like:

      my %fd = ( 'file1' => 'fd1', '/tmp/foo => 'fd2', '/home/me/file' => 'fd3', ); my $in = shift || die "No file specified.\n"; open IN. $in or die "Cannot open $in for input: $!\n"; foreach( keys %fd ) { open $fd{$_}, ">$_" or die "Cannot open $_ for output: $!\n"; } while( <IN> ) { foreach my $fd( keys %fd ) { print $fd $_; } } foreach( keys %fd ) { close $fd{$_}; }

      --
      g r i n d e r
        This line:
        foreach my $fd( keys %fd ) {
        should be:
        foreach my $fd( values %fd ) {
        and instead of reading it in line by line, it would be more efficient just to read a chunk of it at a time so instead of
        while( <IN> ) {
        use
        while( read(IN, $_, 4096) ) {
Re: Copying a file to more than one separate directory and/or file
by lemming (Priest) on Jun 13, 2001 at 19:53 UTC
    You will probably want to take a look at the module File::Copy which is included in current distributions.