in reply to Re: Dynamically searching subdirs with titles based on year,month, and date
in thread Dynamically searching subdirs with titles based on year,month, and date

Ok, so I chdir. The deal is that the subdir is based on
the script looking at the most recent subdir.
Next month the "FEB 2009/Results %m-%d-%y" subdirs
will be created under "RESULTS 2009". Now there will
be "JAN 2009" and "FEB 2009" subdirs with
"Results %m-%d-%y" subdirs.

#!/usr/bin/perl use warnings; use strict; use File::stat; use Time::localtime; use File::Copy; use File::Find; use POSIX qw(strftime); #=for my $tm = localtime; my $YEAR= $tm->year+1900; my $MONTH = $tm->mon; #my $subdir = strftime "Results %m-%d-%y", localtime; #my $YEAR=year+1900; #my $MONTH = #my $YR_RESULT_dir = strftime "RESULTS $YEAR", localtime; my $Month_YR_dir = strftime "$MONTH $YEAR", localtime; my $newdir = '/home/mgavi/testdir1/$Month_YR_dir/'; print "$monthyr"; my $root='/home/mgavi/testdir1'; my $seqdir = "/home/mgavi/testdir2/SeqAssembly"; print "$YEAR $MONTH $root\n"; opendir (my $dh, $root); chdir($newdir); # the new subdir to search my @files=readdir $dh; for my $f (@files){ my $mod_time=-M $monthyr."/".$f; #skip unless modification date is less than one day ago next if $f eq '.' || $f eq '..' || $mod_time > 1.0; print $f,"\t",$mod_time,"\t",ctime(stat($newdir."/".$f)->mtime),"\ +n"; copy("$f","$seqdir"); } closedir $dh;

I get

Usage: POSIX::strftime(fmt, sec, min, hour, mday, mon, year, wday = -1, yday = -1, isdst = -1) at dirtt.pl line 20.
when I run the script

  • Comment on Re^2: Dynamically searching subdirs with titles based on year,month, and date
  • Download Code

Replies are listed 'Best First'.
Re^3: Dynamically searching subdirs with titles based on year,month, and date
by JavaFan (Canon) on Jan 16, 2009 at 23:37 UTC
    I get
    Usage: POSIX::strftime(fmt, sec, min, hour, mday, mon, year, wday = -1, yday = -1, isdst = -1) at dirtt.pl line 20.
    when I run the script
    You get that error if you call strftime without enough argument.
      It's squawking about your strftime. In a new script, try just this:
      use strict; use warnings; use POSIX qw(strftime); my ($m, $y) = strftime ("%b %Y", localtime) =~ m|(\S+)\s(\S+)|; print "$m $y";

      That should get you further...

      Update:

      • For monthly cron's, you might want to cron on the first of the next month and simply get "yesterday's" date. That way you don't have to fight the 28th/29th/30th/31st thing in crontab. And it may save you from checking the files' mtimes, if the application will have begun writing to a new monthly directory. And if you don't mind backticking, GNU date has this slick feature: date --date '1 day ago' '+%b %Y'.
      • You'll probably want to allow yourself to pass in the month and year, or default to the programmatic values. Backups have a way of needing a retro-run.
        Thanks, that has moved me closer to the finish line.
        Hello,
        use strict; use warnings; use POSIX qw(strftime); my ($m, $y) = strftime ("%b %Y", localtime) =~ m|(\S+)\s(\S+)|; print "$m $y";
        when used in:
        #!/usr/bin/perl use strict; use warnings; use POSIX qw(strftime); my $Results = strftime ("Results %m-%d-%y", localtime) =~ m|(\S+)\s(\S ++)|; print "$Results\n"; #my ($m, $y) = strftime ("%b %Y", localtime) =~ m|(\S+)\s(\S+)|; #print "$m $y\n"; my $root='/home/mgavi/testdir1'; my $seqdir = "/home/mgavi/testdir2/SeqAssembly"; opendir (my $dh, $root); #chdir($newdir); my @files=readdir $dh; for my $f (@files){ my $mod_time=-M $root."/".$f; #skip unless modification date is less than one day ago next if $f eq '.' || $f eq '..' || $mod_time > 1.0; print $f,"\t",$mod_time,"\t",ctime(stat($root."/".$f)->mtime),"\n" +; copy("$f","$seqdir"); } closedir $dh;

        returns:
        1

        I am looking for "Results 01-16-9-09A" to be returned because
        that is the most recent dir in "JAN 2009" directory.