I meant to post my original code, where line 11 used the -f file test (so
that directories wouldn't be included in the output). My questions still
apply when using -f instead of -e. If we could refer the email below for
future discussion, that would be great! Sorry about the screwup. :-)
Thanks!
-Nick
Nick_D_Montpetit@
eFunds.com To: [EMAIL PROTECTED]
cc:
01/11/02 10:57 AM Subject: Help with File::Find
Hi Everyone!
I'm fairly new to Perl, and completely new to submitting to the list, so
please be easy on me. :-)
The purpose of the code I wrote (listed below) is to go through the current
directory and all of its subdirectories and report the filename, size and
age of the x largest files, where x depends on the argument supplied on the
command line and the number of files in the directory. I'm sure there's an
easier way to do this with a UNIX utility (or with Perl), but this program
has been a good learning experience for me.
The code below runs without any syntax errors, but File::Find (which I love
and use frequently) or the -f file test doesn't give the results I expect.
Specifically, my (explicit) checks show that the test in line 11 does not
always evaluate to TRUE for values of $_ corresponding to legitimate (i.e.,
existing and size > 0) files, which means I'm missing files that should be
in my final output. If I change line 11for debugging purposes to simply
if ($_){
all files (including the previously missed ones) are printed out (also
along with the directories now) as expected, but for the files that would
not have passed the (-f $_) test, the values assigned for filesize and age
in line 12 are (tested to be) undefined. If this is any help, the files
that don't pass the (-f $_) of test of line 11 are (perhaps coincidentally)
the biggest files (~55 GB) in the directory.
I've researched the File::Find documentation and checked the FAQ's with no
luck, so I'm hoping someone out there can help me.
Also, is there a function that returns a minimum value in an array? It's
not my biggest concern right now, but it would make line 20 simpler.
1: #!/usr/local/bin/perl -w
2:
3: use Cwd;
4: use File::Find;
5: use FileHandle;
6:
7: ($filecount = shift) || ($filecount = 20);
8:
9: sub wanted{
10: my $flag = 0;
11: if (-f $_){
12: push(@filelist, [$File::Find::name, -s $_, -M $_]);
13: }
14: }
15:
16: $dir = cwd();
17:
18: find(\&wanted,$dir);
19:
20: foreach $fileref ((sort {$b->[1] <=> $a->[1]} @filelist)[0..(sort( {$a
<=>$b} $filecount,scalar(@filelist)-1))[0]]){
21: write STDOUT;
22: }
23:
24: STDOUT -> format_name("STDOUT_BOT");
25: write STDOUT;
26:
27: format STDOUT_TOP=
28: FILENAME
FILE SIZE (BYTES) AGE (DAYS)
29:
------------------------------------------------------------------------------------------------------------------
30: .
31: format STDOUT=
32:
@<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
>>>>>>>>>>>>>>>> @>>>
33: $fileref->[0], $fileref->[1], sprintf("%4.0f", ($fileref->[2]))
34: .
35: format STDOUT_BOT=
36:
-----------------------------------------------------------------------------------------------------------------
37: .
...
--
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
--
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]