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

Hello, Thanks for the help. I decided to go with the for loop way as it seems to work nicely. I made some changes as the time was a bit confusing however date seem to be a bit better on the eye's. I just relized that I also need to deal with .zip.meta files aswell. How could I change this so, if it's .zip then it renames it or if it's .zip.meta that it also renames the files to the time stamp aswell?
foreach my $upload (@uploads) { my $newName = $upload; $newName =~ s/\.zip$/-${mday}-${mon}-${year}.zip/; copy ($logSite . ${upload}, $localCpPath . $newName)or die "F +ailed to copy"; print "File $upload has been copied over and renamed $newName +\n"; $count++ }

Replies are listed 'Best First'.
Re: Add timestamp to file being copied.
by markkawika (Monk) on Jun 08, 2009 at 23:30 UTC
    Your question doesn't make clear what timestamp you want to use.

    It appears from your code that you want to use the time that the script was run as the timestamp on the file, as opposed to the timestamp of the original file you were copying.

    If that's the case, may I suggest:

    use File::Copy; my ($sec, $min, $hour) = localtime(); foreach my $upload (@uploads) { my $newName = $upload; $newName =~ s/\.zip$/${hour}:${min}:{sec}.zip/; copy ($logSite . ${upload}, $localCpPath . $newName) or die "Failed to copy "$upload"; print "File $upload has been copied over and renamed $newName\n"; }
      Hello, It seems to work. I made one minor changes as the month day and year seem to be a better identifer.
      foreach my $upload (@uploads) { my $newName = $upload; $newName =~ s/\.zip$/-${mday}-${mon}-${year}.zip/; copy ($logSite . ${upload}, $localCpPath . $newName)or die "F +ailed to copy"; print "File $upload has been copied over and renamed $newName +\n"; }
      I had one further question. I forgot to mention the files can eitehr be .zip or .zip.meta Now I see that we are only zip files with the pattern matching. What would be the best way so it changes the meta file aswell. If statement perhaps in the middle of the for loop?
Re: Add timestamp to file being copied.
by ww (Archbishop) on Jun 08, 2009 at 23:54 UTC

    or, TIMTOWTDI...

    #!/usr/bin/perl use warnings; use strict; #769688 my ($sec, $min, $hr); # easier on your fingers; fewer "my"s.. +. ($sec,$min,$hr) = localtime(time); if ( $sec =~ /(\d{1})/ ) { # deal with times ending w/0..9 seconds $sec = "0" . $1; } my $file = 'filename.zip'; #if you need to act upon a list of files +, loop my @filenamearray = split(/\./, $file); my $newfilename = "$filenamearray[0]" . "-" . $hr . ":" . $min . ":" . + $sec . "\." . $filenamearray[1]; print $newfilename . "\n"; #now upload $newfilename...

    Output of repeated execution appears to meet your spec.

    filename-19:50:00.zip filename-19:50:04.zip filename-19:50:07.zip filename-19:50:09.zip filename-19:50:10.zip filename-19:50:11.zip
      my $newfilename = "$filenamearray[0]" . "-" . $hr . ":" . $min . ":" . + $sec . "\." . $filenamearray[1];

      In such cases, I personally prefer interpolation over concatenation:

      my $newfilename = "$filenamearray[0]-$hr:$min:$sec.$filenamearray[1]";

      Appears less cluttered to my eyes (YMMV).  As there's nothing special about either '-', '.' or (single) ':' in double quoted strings, and they can't be part of variable names, you can write them just as is.

      Or maybe use sprintf() to get regular zero-padded 2-digit format:

      my $newfilename = sprintf "%s-%02d:%02d:%02d.%s", $filenamearray[0], $ +hr,$min,$sec, $filenamearray[1];
        Hello all, Thanks for suggestions. Let me give it a try and see.
Re: Add timestamp to file being copied.
by bichonfrise74 (Vicar) on Jun 08, 2009 at 22:29 UTC
    I wonder if you need to do a stat on the new files because you said that you wanted to append the timestamp after the file has been copied.