Copy multiple folders to a single destination with robocopy

43,921

Solution 1

Try this one:

gci C:\results\1319_TC1.* | foreach-object { robocopy $_.fullname (".\datastore\somefolder\" + $_.name) }

gci C:\results\1319_TC1.* get's all matching files/directories first and puts them through the pipe where foreach-object takes care of all results from the first command. It'll robocopy the fullpath of each result (full path to your result-directories) and put them into .\datastore\somefolder\ with its original foldername e.g.:
C:\results\1319_TC1.123456 -> C:\results\datastore\somefolder\1319_TC1.123456

That thing in braces will put that target-directory-name and the original folder-name together.

Edit:
I just saw that your target-directory should be a UNC-path. Robocopy accepts UNC-paths (even with path-names longer than 256 characters). You just have to replace (".\datastore\somefolder\" with ("\\datastore\somefolder\" in my command. So the right command would be:

gci C:\results\1319_TC1.* | foreach-object { robocopy $_.fullname ("\\datastore\somefolder\" + $_.name) }

Solution 2

You would do it in a batch file. You will need on line per directory.

In the alternative, you could do this, which would copy everything and then delete the excess if that is easier: Robocopy z:\directory d:\directory /MIR /COPYALL (Caution: MIR is for mirror image and will overwrite anything in its way, so use only on a blank directory).

Solution 3

Robocopy specifically does not support inclusion patterns, but it does support exclusion patterns. It also supports copying only files and folders which are already mirrored in the target directory, so you can combine both together to implement a flexible solution to include only folders with a specific pattern.

This answer is adapted from the beautiful answer by John at: https://community.spiceworks.com/topic/70361-robocopy-folder-wildcard

What you would like to have:

robocopy mySrc myDest /S /IncludeFolders 1319_TC1.*

What you can actually do:

  1. robocopy mySrc myDest /E /CREATE
  2. robocopy myDest DeleteMe /E /MOVE /XD 1319_TC1.*
  3. robocopy mySrc myDest /S /XL
  4. rd DeleteMe /s

Explanation

Step 1 creates a copy of the entire source, but all files are 0 Bytes (no actual movement of data)

Step 2 moves out all the folders that are not the target pattern into some temp folder (i.e all folders that do not start with 1319_TC1.)

Step 3 does the actual copy, copying from source into target only the files which are already in the destination

Step 4 deletes the unwanted 0 Byte files

This is such a great solution as it will only effectively copy the files you want but greatly increases the available expressivity that was intended in the original robocopy, genius!

Solution 4

You will not be able to do this with Robocopy alone. If you have access to a linux machine, it would be trivially easy using find with the -exec option. Or you could use cygwin on windows (I would guess it has the find command), or you could use a scripting language like Ruby or Python on Windows.

Share:
43,921

Related videos on Youtube

SDGuero
Author by

SDGuero

Updated on September 18, 2022

Comments

  • SDGuero
    SDGuero over 1 year

    I'm looking for a solution to use robocopy to copy several folders from a directory onto a distant network share. I want to choose several folders out of a directory that contains hundreds of folders I'm not interested in. I want to do something similar to scp in linux using regex, but this doesn't work in robocopy:

    c:\robocopy "c:\results\1319_TC1.*" "\\datastore\somefolder\"
    
  • wullxz
    wullxz almost 13 years
    Linux or cygwin aren't neccessary since he has access to powershell which is able to use regex. However, this would work...
  • James
    James almost 13 years
    Yeah, of course these are not the only options, but they would be my top picks.
  • wullxz
    wullxz almost 13 years
    Yeah, each to his own liking :)