File::Find does a depth first traversal of a directory structure. For each directory, it uses readdir to obtain the directory's contents. Perl's documentation of readdir doesn't define an order, presumably leaving that up to the operating system. Excluding the depth-first part of the traversal, and just focusing on the files within each directory, themselves, it will list them in the order that readdir obtains them. There is no simple way to impose your own behavior on the internal readdir().
However!!! There's a hook. ;) There is the preprocess option, which provides a hook you could use to sort the directory as you see fit before &wanted is called.
Here's the relevant explanation from the File::Find POD:
preprocess
The value should be a code reference. This code reference is used to preprocess the current directory. The name of the currently processed directory is in $File::Find::dir. Your preprocessing function is called after readdir(), but before the loop that calls the wanted() function. It is called with a list of strings (actually file/directory names) and is expected to return a list of strings. The code can be used to sort the file/directory names alphabetically, numerically, or to filter out directory entries based on their name alone.
Update: I looked at the source code to clarify one thing that wasn't clear in the documentation. The documentation said that the preprocess coderef would be executed before the loop that calls wanted(), but it didn't specify if the depth-first traversal would dive in deeper beforehand or not. As it turns out, the answer is no, which (to me) seems like a good thing. That means you can re-order (or even remove items from) the list before File::Find dives into the next level. I've long disliked the callback user interface for File::Find, with its heavy use of global variables rather than passing parameters explicitly to &wanted(). But now I've found one thing I like about it. ;)
| [reply] [d/l] [select] |
I'm not sure where to start - this question is so orthogonal to how things work, that I'm confused. What are you trying? Where were the docs unclear? Knowing where you are helps us tailor our responses to you.
| [reply] |
I assume you've read the documentation and found nothing specifying any ordering. Which usually means there is none
Even if someone told you now that he knows that File::Find internally sorted the files alphabetically, would that help you in any way? Because you couldn't depend on that "feature". After the next minor update of the module this might not be the case anymore. Stick to what the module documentation says and not says.
Also the information text about the "preprocess" option hints strongly that whatever ordering the files may have, they are not ordered alphabetically or numerically. But obviously you could use that option to sort the names in any order you want
| [reply] |
#!/usr/bin/perl -sl
use strict;
use warnings;
use File::Find::Rule::Age;
my $dir = '/path/to dir';
my(@old_files) = find(
file => (),
name => '*.pm',
age => [ older => '1h' ],
in => $dir );
foreach my $old_file(@old_files) {
print $old_file;
}
| [reply] [d/l] |