http://www.perlmonks.org?node_id=1010862


in reply to removing directories with wildcard glob in OS-portable way

Please tell me I'm over-thinking this!

You're over thinking this! :) Or rather, going about things the hard way.

Assuming the command you gave does what you need everywhere bar Windows, just use this when you detect Windows:

system qq[ for /d %d in ($tmp\\scale-*) do @rd /q /s %d ];

Eg:

C:\test>dir /b /s ppp C:\test\ppp\donttouch C:\test\ppp\scale-123 C:\test\ppp\scale-124 C:\test\ppp\scale-125 C:\test\ppp\donttouch\junk.1 C:\test\ppp\scale-123\junk C:\test\ppp\scale-123\junk\junk.1 C:\test\ppp\scale-123\junk\junk.2 C:\test\ppp\scale-123\junk\junk.3 C:\test\ppp\scale-124\junk C:\test\ppp\scale-124\junk\junk.1 C:\test\ppp\scale-124\junk\junk.2 C:\test\ppp\scale-124\junk\junk.3 C:\test\ppp\scale-125\junk C:\test\ppp\scale-125\junk\junk.1 C:\test\ppp\scale-125\junk\junk.2 C:\test\ppp\scale-125\junk\junk.3 C:\test>for /d %d in (ppp\scale-*) do rd /q /s %d C:\test>rd /q /s ppp\scale-123 C:\test>rd /q /s ppp\scale-124 C:\test>rd /q /s ppp\scale-125 C:\test>dir /b /s ppp C:\test\ppp\donttouch C:\test\ppp\donttouch\junk.1

Why reinvent an operation that the OS already knows how to do?


With the rise and rise of 'Social' network sites: 'Computers are making people easier to use everyday'
Examine what is said, not who speaks -- Silence betokens consent -- Love the truth but pardon error.
"Science is about questioning the status quo. Questioning authority".
In the absence of evidence, opinion is indistinguishable from prejudice.

Replies are listed 'Best First'.
Re^2: removing directories with wildcard glob in OS-portable way
by Anonymous Monk on Dec 30, 2012 at 00:32 UTC
    Thanks! After getting up from the computer I had one of those insights that makes me think "Wow, I feel stupid." How about:

    File::Path::remove_tree(glob(File::Spec->catdir($tmpdir,'scale-').'*'));

    No OS-detection necessary!

      Trust me, the OS detection is happening, just not in your code. But that's not the problem.

      It's all teh other stuff that is happening under the covers that you also don't know about.

      This:

      perl -E"system q[for /d %d in (scale-*) do @rd /q /s %d]"

      Does the same job as this:

      perl -MFile::Path -MFile::Spec -wE"File::Path::remove_tree(glob(File:: +Spec->catdir('.','scale-').'*'));"

      But uses only 7% of the user cpu and 3% of the system cpu.

      Does it matter? Depends alot on how big the trees are and how often you run the command I guess, but why use cycles you don't have to.


      With the rise and rise of 'Social' network sites: 'Computers are making people easier to use everyday'
      Examine what is said, not who speaks -- Silence betokens consent -- Love the truth but pardon error.
      "Science is about questioning the status quo. Questioning authority".
      In the absence of evidence, opinion is indistinguishable from prejudice.
        Pretty shallow trees (1 level, a few subdirs, a few thousand files total) and the operation only happens once per run (a run may persist for hours to weeks or possibly months), so this does not need to be optimized at all. I was more concerned about heading off any "why doesn't your code work on my non-*nix OS?" Will trade processor cycles for programming cycles here, I think, and avoid having to know about all those DOS /flags, and similarly for any other OS somebody tries to use.

        But that sort of thing--dropping to the system level for intensive file management--is good to know if I need increased performance for similar tasks in the future.