I'd like to use xcopy on a Windows machine to pull out all files with .png extension into a single directory.

I tried xcopy C:\folder\*.png /s C:\png\, but it is keeping the sub-directories inside \folder, (for example in C:\png, there is C:\png\a\b\c\img.png) which I don't want. I simply want all .png inside C:\png without it retaining the directory structure that was in C:\folder.


This can be done with good old for:

for /r C:\Folder %f in (*.png) do @copy "%f" C:\png

Nothing fancy.

| improve this answer | |
  • It works! Care to explain what the %f is for? – bobobobo Nov 18 '10 at 19:13
  • It's the loop variable. – Joey Nov 18 '10 at 21:53
  • 3
    This didn't work for me, I got something to the effect of f" was unexpected at this time. Changing %f to %%f worked. However, I was running this in a batch file: If you are using the FOR command at the command line rather than in a batch program, use just one percent sign: %G instead of %%G. ss64.com/nt/for.html – ta.speot.is Dec 8 '14 at 0:27
  • 1
    Uhm, yes. That's expected and exactly as you quoted. Where I'd your confusion coming from? – Joey Dec 8 '14 at 22:00
  • 1
    @kayleeFrye_onDeck: As far as I know there are no special variables. The only thing that springs to mind is that people unfamiliar with for may get confused about the two different d in things like %~dd. The for documentation suggests to use uppercase letters for variables to avoid confusion, but substitutions are still clearly distinguishable from the variable name, I think. – Joey Jan 20 '17 at 8:29

If you have cygwin installed, this would be a job for find:

cp `find /cygdrive/c/folder/* -name '*png'` /cygdrive/c/png/

(though that will have trouble if any of the filenames have spaces in them - you'll find some variant of a find command that will work in all circumstances though)

If you are running Vista, 2003 or 2008 then the less flexible but still useful "forfiles" is your friend. Something like:

FORFILES /P c:\folder\ /M *.png /S /C "cmd /c copy @file c:\png\"

Note: I've not tested either of the above commands, but in theory they should work...

| improve this answer | |
  • +1 just verified that the FORFILES command works. I ran it twice and it copied the 2nd time w/out prompt, so I assume it just overwrites if it finds duplicates. – hyperslug Aug 8 '09 at 18:39

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.