You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在不保留文件夹结构的前提下仅复制较新文件至根目录?

平级复制子文件夹文件并仅覆盖更新的目标文件

方法一:PowerShell 条件判断复制

直接遍历所有子文件,针对每个文件判断目标路径是否存在、源文件是否更新,仅在需要时复制:

Get-ChildItem "D:\VaM\Custom\Atom\Person\Morphs\temp2\female" -Recurse -File | ForEach-Object {
    $destFilePath = Join-Path "D:\VaM\Custom\Atom\Person\Morphs\female" $_.Name
    $destFileExists = Test-Path $destFilePath

    if (-not $destFileExists) {
        # 目标文件不存在,直接复制
        $_ | Copy-Item -Destination $destFilePath
    }
    else {
        # 目标文件存在,对比最后修改时间
        $destFile = Get-Item $destFilePath
        if ($_.LastWriteTime -gt $destFile.LastWriteTime) {
            # 源文件更新,强制覆盖
            $_ | Copy-Item -Destination $destFilePath -Force
        }
    }
}

逻辑说明

  • 遍历源目录下所有子文件(不含文件夹)
  • 对每个文件拼接目标根目录的完整路径
  • 目标文件不存在时直接复制
  • 目标文件存在时,仅当源文件的最后修改时间晚于目标文件时,才执行覆盖

方法二:Robocopy + 平级移动(适合大文件场景)

如果源文件数量多、体积大,Robocopy的效率更高,可以先将文件复制到临时目录(保留结构),再将临时目录下的所有文件平级移动到目标根目录:

# 步骤1:用Robocopy将更新的文件复制到临时目录(保留结构)
$tempDir = "D:\VaM\Custom\Atom\Person\Morphs\temp_copy"
robocopy "D:\VaM\Custom\Atom\Person\Morphs\temp2\female" $tempDir /E /XO

# 步骤2:将临时目录下所有子文件平级移动到目标根目录
Get-ChildItem $tempDir -Recurse -File | ForEach-Object {
    $destFilePath = Join-Path "D:\VaM\Custom\Atom\Person\Morphs\female" $_.Name
    # 直接移动(若需保留源文件,改用Copy-Item)
    $_ | Move-Item -Destination $destFilePath -Force
}

# 步骤3:删除临时目录
Remove-Item $tempDir -Recurse -Force

逻辑说明

  • /E 参数:复制所有子目录(包括空目录)
  • /XO 参数:仅复制比目标新的文件
  • 后续通过Get-ChildItem遍历临时目录的所有文件,平级移动到目标根目录
  • 最后清理临时目录

注意事项

  • 如果源目录存在同名文件,最终保留的是最后处理的那个更新版本,需确认这种重名覆盖逻辑符合你的需求
  • 若目标文件存在只读属性,需确保命令中的-Force参数生效(两种方法均已包含)

内容的提问来源于stack exchange,提问作者Puck

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 04:02:03