将文件从多个(指定)文件夹路径复制到另一个目录,同时保持文件结构

Posted

技术标签:

【中文标题】将文件从多个(指定)文件夹路径复制到另一个目录,同时保持文件结构【英文标题】:Copying files from multiple (specified) folder paths to another directory while maintaining file structure 【发布时间】:2017-08-14 13:09:51 【问题描述】:

我正在尝试使用 PowerShell 将多个文件从一个目录复制到另一个目录。 我想:

维护文件夹/文件结构。 复制特定文件夹中的所有文件。

假设结构:

源文件夹 \用户 1 \文件夹 1 \文件 \文件夹 2 \文件 \文件夹 3 \文件 \用户 2 \文件夹 3 \文件 \用户 3 \文件夹 2 \文件 \用户 4 \文件夹 3 \文件 \文件夹 4 \文件

可能的场景:

我想复制用户拥有文件夹 1 和文件夹 2 的文件。

预期结果:

目标文件夹 \用户 1 \文件夹 1 \文件 \文件夹 2 \文件 \用户 3 \文件夹 2 \文件

这是我目前的代码:

$FolderName = '\\Folder 1\\'
$source = 'C:\CDPTest\Live'
$target = 'C:\CDPTest\DevTest'
$source_regex = [regex]::Escape($source)

(gci $source -Recurse | where -not ($_.PSIsContainer) | select -Expand FullName) -match $FolderName |
    foreach 
        $file_dest = ($_ | Split-Path -Parent) -replace $source_regex, $target
        if (-not (Test-Path $file_dest)) mkdir $file_dest
    

正如您所见,匹配只会根据当前代码返回一个文件路径,我想做的是扩展它以匹配多个文件夹名称。

我尝试过的:

在单独的 PowerShell 文件中使用不同的 FolderName 运行此代码,但没有成功。 使用文件夹名称数组进行匹配。 使用-and/-or 运算符扩展匹配功能。

【问题讨论】:

你似乎在寻找robocopy 您好,感谢您的回复,我尝试了 robocopy 无济于事,我选择了 PowerShell,因为我认为它更强大。我将在 robocopy 再试一次。 使用robocopy,您排除了您不想想要复制的内容,因此请尝试robocopy $source $target /s /xd "User 2" "User 4" 再次感谢您的回复,我试图避免排除并使用包含,因为与我需要的 5 个相比,有很多潜在的文件夹名称。 您可以像这样构建排除列表:$include = 'User 1', 'User 3'; ls $source | ? $include -notcontains $_.Name 【参考方案1】:

感谢所有对这个问题的回复,你们都帮助我指出了正确的方向。这是我采用的解决方案:

#Used for time-stamped logs (requires C:\Root\RobocopyLogs\ to exist)
#$log can be added after '$dest$'
#$dateTime = Get-Date -Format g
#$currentDateTime = get-date -format "MM.dd.yyyy-HH.mm.ss.fff"
#$log = "/log:C:\Root\RobocopyLogs\$currentDateTime.txt"

# Set up variables
$sourceRootDirectory = "C:\Root\Source"
$userDirectories = $sourceRootDirectory+"\*\"
$dest = "C:\Root\Destination"
$excludeExceptions = @("Folder 1",
"Folder 2",
"Folder 3",
"Folder 4",
"Folder 5")

# Get the exclusion list from the source
$excludedFolderArray = (gci $userDirectories -Exclude $excludeExceptions)
$excludedFileArray = $excludedFolderArray |
    Where-Object $_.PSIsContainer -eq $False

Robocopy $sourceRootDirectory $dest /FFT /MIR /XA:H /R:1 /W:5 /XD $excludedFolderArray /XF $excludedFileArray

我在与 robocopy 同步时遇到问题,如果文件放在根文件夹中,它将被复制过来。我必须创建一个单独的文件列表以从根目录中排除。

【讨论】:

恭喜。请注意,Get-ChildItem 的-Exclude 参数仅对叶子有效,您不能通过这种方式排除部分路径。【参考方案2】:

虽然 robocopy 可能仍然是最好的方法,但 此脚本首先标识要复制的文件夹(使用 or | RegEx),然后构造目标文件夹并在必要时创建它。 (未经测试)

$FolderName = [regex]('\\Folder 1$|\\Folder 2$')
$source = 'C:\CDPTest\Live'
$target = 'C:\CDPTest\DevTest'
Get-ChildItem $source -Recurse | 
  Where-Object $_.PSIsContainer -and $_.FullName -match $FolderName |
    Foreach-Object 
      $targetFolder = Join-Path $target ($_.FullName -replace [RegEx]::escape($source),'')
      if (!(Test-Path $targetFolder)) mkdir $targetFolder|Out-Null
      Copy-Item -Path $_ -Filter * -Destination $targetFolder
    

【讨论】:

感谢您抽出宝贵时间回复,您的评论很有帮助。我已经发布了我的解决方案。

以上是关于将文件从多个(指定)文件夹路径复制到另一个目录,同时保持文件结构的主要内容,如果未能解决你的问题,请参考以下文章

linux怎么将一个文件移动到另一个目录下

如何根据指定目录从一个文件夹中(含子文件夹)中搜索对应文件并自动复制至新路径下?

linux 怎样复制一个目录的所有文件到另一个目录

linux下怎么把一个文件复制到另一个文件夹

linux 中把一个文件夹下的文件复制到同目录下不同的文件夹下?

linux复制文件到指定的文件夹