Beefy Boxes and Bandwidth Generously Provided by pair Networks
Do you know where your variables are?

Re: Recursive image processing (with ImageMagic)

by jethro (Monsignor)
on Nov 22, 2012 at 22:30 UTC ( #1005192=note: print w/replies, xml ) Need Help??

in reply to Recursive image processing (with ImageMagic)

The standard module for traversing directories is File::Find. You just need to provide a function detailing what to do with each file. The find function of File::Find also calls directories before files so you can just create the target dirs without worrying about the sequence of calls.

  • Comment on Re: Recursive image processing (with ImageMagic)

Replies are listed 'Best First'.
Re^2: Recursive image processing (with ImageMagic)
by wvick (Novice) on Nov 23, 2012 at 17:41 UTC

    My only problem is using something like File:Find is that I think it's better for finding file "needles in a haystack", rather than processing ALL the files (they're all PNGs in my case). It also makes the directory handling more complicated as I need to check or create (regardless) the output folder for and every file created. Unless, I suppose, File:Find returns files in blocks so I can check the last folder created and only mkdir when needed.

    Do you also feel that since every file/sub-directory is being processed, then a recusrive search would be best. i.e. every time a new directory is handle, I mkdir the same in the destination.

      File:Find is that I think it's better for finding file "needles in a haystack", rather than processing ALL the files

      I don't think so. Without fine tuning, find({wanted => \&wanted, ...}) invokes wanted for each file and directory found, so wanted sees the entire haystack including all needles, piece by piece.

      I need to check or create (regardless) the output folder for and every file created

      No. File::Find also calls wanted for the directories found during the file tree traversal. You need to check and create directories only in that case.

      You could also use the preprocess option, it is invoked exactly when you want to create the target directory:

      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. When follow or follow_fast are in effect, preprocess is a no-op.


      Today I will gladly share my knowledge and experience, for there are no sweeter words than "I told you so". ;-)

        Thanks, Alexander

        I'll follow your advice and stick to File:Find, even though I don't get any benefit from finding/storing the large file list in advance of processing.

        From an overnight test run, my process consume a lot of memory. Could this ben Find:Find ? I suspect it's more to do with the image processing and creation of image objects which are not being released.


Log In?

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://1005192]
and all is quiet...

How do I use this? | Other CB clients
Other Users?
Others studying the Monastery: (7)
As of 2018-05-20 12:19 GMT
Find Nodes?
    Voting Booth?