in reply to Re: recursive directory question
in thread recursive directory question

# Usage: find_archive [directory 1] [directory 2] ... [directory n] use File::Find; # file's date of last access is determining factor my %access; #$access{$dirname}{old}, $access{$dirname}{new} my @top_dirs = @ARGV; # allows us to search over mul +tiple trees # eg /home/jarich/ /home/aquil +o/ if # specified on command line push @top_dirs, "." unless @top_dirs; # default behaviour my $results_file = "./archive_results.txt"; find sub { return unless -f; $access{$File::Find::dir}{-A _ > 180 ? 'old' : 'new'}++; }, @top_dirs; my @results; for (sort keys %access) { $access{$_}{old} ||= 0; # defaults to avoid warnings $access{$_}{new} ||= 0; if ($access{$_}{old} > $access{$_}{new}) { push @results, "$_"; # keep results rather than pri +nting } } # Dump all to file. open RESULTS, "> $results_file" or die "Failed to open $results_file for writing: $!\n +"; print RESULTS join("\n", @results), "\n"; close RESULTS;

Update: Added $! to open statement and extra newline.

Replies are listed 'Best First'.
•Re: Re: Re: recursive directory question
by merlyn (Sage) on Jul 09, 2002 at 01:07 UTC
    open RESULTS, "> $results_file" or die "Failed to open $results_file for writing\n"; print RESULTS join("\n", @results); close RESULTS;
    That's missing the final newline (a common mistake). Perhaps you wanted:
    open RESULTS, ">$results_file" or die; print RESULTS "$_\n" for @results; close RESULTS;
    And as for:
    $access{$_}{old} ||= 0; # defaults to avoid warnings $access{$_}{new} ||= 0; if ($access{$_}{old} > $access{$_}{new}) { push @results, "$_"; # keep results rather than pri +nting }
    I'd recast that as:
    if (($access{$_}{old} || 0) > ($access{$_}{new} || 0)) { push @results, "$_"; # keep results rather than pri +nting }
    mostly because I hate changing values when all I'm really trying to do is test them. One of the many reasons why I'm not religious about enabling -w.

    -- Randal L. Schwartz, Perl hacker