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

I need to go down another dir. Any ideas?
Uhm, chdir?
  • Comment on Re: Dynamically searching subdirs with titles based on year,month, and date

Replies are listed 'Best First'.
Re^2: Dynamically searching subdirs with titles based on year,month, and date
by lomSpace (Scribe) on Jan 16, 2009 at 23:13 UTC

    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

      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.