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. ;)


Dave


In reply to Re: file::find::name question by davido
in thread file::find::name question by mark4444az

Title:
Use:  <p> text here (a paragraph) </p>
and:  <code> code here </code>
to format your post, it's "PerlMonks-approved HTML":



  • Posts are HTML formatted. Put <p> </p> tags around your paragraphs. Put <code> </code> tags around your code and data!
  • Titles consisting of a single word are discouraged, and in most cases are disallowed outright.
  • Read Where should I post X? if you're not absolutely sure you're posting in the right place.
  • Please read these before you post! —
  • Posts may use any of the Perl Monks Approved HTML tags:
    a, abbr, b, big, blockquote, br, caption, center, col, colgroup, dd, del, details, div, dl, dt, em, font, h1, h2, h3, h4, h5, h6, hr, i, ins, li, ol, p, pre, readmore, small, span, spoiler, strike, strong, sub, summary, sup, table, tbody, td, tfoot, th, thead, tr, tt, u, ul, wbr
  • You may need to use entities for some characters, as follows. (Exception: Within code tags, you can put the characters literally.)
            For:     Use:
    & &amp;
    < &lt;
    > &gt;
    [ &#91;
    ] &#93;
  • Link using PerlMonks shortcuts! What shortcuts can I use for linking?
  • See Writeup Formatting Tips and other pages linked from there for more info.