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

Hello,

I am using a Unix box and have to copy some files.
I am using this code
#!/usr/bin/perl + open (GG,"getall.txt"); $dest="/home/test/files/"; $targ="/home/new/newfiles/"; while ($_=<GG>) { ($first,$second,$third)=split(/\./,$_); print "first: $first second: $second third: $third \n"; system (`cp $dest $_ $targ`); } close(GG);
But get this error:
cp: /home/test/files/: is a directory. Need "-R" option. sh: /home/new/newfiles/: Execute permission denied.
the 'getall.txt' file looks like this:
get.3.020922120002 get.3.020923120002 get.3.020924120001 get.3.020925120001 get.3.020926120002 get.4.020921153001 get.4.020922153001 get.4.020923153002 get.4.020924153001 get.4.020925153002 get.5.020922083002 get.5.020923083002 get.5.020924083002 get.5.020925083003 get.5.020926083002
I am just trying to copy - not execute. I can do it from a command line. But must have screwed something up.

Why the split statement? Well I need to then rename the files keeping the 2nd and 3rd parts of the split the same. So the I can cp and rename the files from:

get.3.020922120002

to

gotit.3.020922120002

But I can't even get the copy working....

Help?

V

Replies are listed 'Best First'.
Re: Copying files
by RMGir (Prior) on Sep 26, 2002 at 19:31 UTC

    Whenever you use system, it's a good idea to test your code with "print" first, so you can make sure you're about to execute the right thing.

    Also, you should use system OR ``, but not both.

    Once you've decided whether you want system or `` (hint, you want system :), since you don't care about the returned text), you should fix try this:

    #!/usr/bin/perl open(GG,"getall.txt"); $dest="/home/test/files/"; $targ="/home/new/newfiles/"; while ($_=<GG>){ chomp; # thanks Enlil! ($first,$second,$third)=split(/\./,$_); print "first: $first second: $second third: $third \n"; print "cp ${dest}$_ $targ\n"; #system("cp ${dest}$_ $targ"); } close(GG);

    Once you're convinced that this does the right thing, comment out the print and use the system line...
    --
    Mike

    (Edit: Thanks, Enlil, for reminding me about chomp.)

Re: Copying files
by Enlil (Parson) on Sep 26, 2002 at 19:27 UTC
    Untested but:
    #!/usr/bin/perl open(GG,"getall.txt"); $dest="/home/test/files/"; $targ="/home/new/newfiles/"; while (<GG>) { ($first,$second,$third)=split(/\./,$_); print "first: $first second: $second third: $third \n"; my $dest_file = $dest . $_; my $target_file = $targ . "gotit.$second.$third"; system (`cp $dest_file $target_file`); } close(GG);
    since $dest is a directory you are getting the error as that is your first argument passed to cp. -Enlil
      I meant to put a chomp in there also so it should read:
      #!/usr/bin/perl open(GG,"getall.txt"); $dest="/home/test/files/"; $targ="/home/new/newfiles/"; while (<GG>) { chomp; ($first,$second,$third)=split(/\./,$_); print "first: $first second: $second third: $third \n"; my $dest_file = $dest . $_; my $target_file = $targ . "gotit.$second.$third"; system (`cp $dest_file $target_file`); } close(GG);
      -Enlil
        File::Copy? It saves hassle at least... Mark