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]