首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何复制某些文件(w/o文件夹层次结构),但不覆盖现有文件?

如何复制某些文件(w/o文件夹层次结构),但不覆盖现有文件?
EN

Stack Overflow用户
提问于 2013-07-05 22:35:00
回答 5查看 16.9K关注 0票数 11

我需要将所有*.doc文件(但不是名称与*.doc匹配的文件夹)从网络文件夹\\server\source (包括所有嵌套文件夹中的文件)复制到本地文件夹C:\destination,而不保留嵌套文件夹层次结构(即所有文件应直接进入C:\destination,不应在C:\destination中创建嵌套文件夹)。如果在\\server\source的不同子文件夹中有几个同名的文件,那么只应该复制第一个文件,然后再不要覆盖--以后发现的所有冲突文件都应该被跳过(可能有很多这样的情况,跳过的文件不应该在网络上传输,否则会花费太多的时间)。下面是我在PowerShell中实现它的尝试:

代码语言:javascript
运行
复制
cp \\server\source\* -Recurse -Include *.doc -Container:$false -Destination C:\destination

这个命令至少有两个问题:

  • 它也复制名称与*.doc匹配的文件夹。
  • 在名称冲突的情况下,稍后发现的任何文件都将通过网络传输并覆盖前一个文件。

你能建议如何解决这些问题吗?

使用copyxcopyrobocopycscript*.bat*.cmd实现也是受欢迎的。

本地操作系统是Windows 8,文件系统是NTFS。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2013-07-05 23:10:52

我将首先生成文件列表,并在您浏览该列表时进行验证。

就像这样:

代码语言:javascript
运行
复制
$srcdir = "\\server\source\";
$destdir = "C:\destination\";
$files = (Get-ChildItem $SrcDir -recurse -filter *.doc | where-object {-not ($_.PSIsContainer)});
$files|foreach($_){
    if (!([system.io.file]::Exists($destdir+$_.name))){
                cp $_.Fullname ($destdir+$_.name)
    };
}

因此,使用Get-ChildItem列出与筛选器匹配的源文件夹中的文件,通过管道通过where-object删除目录。

然后遍历foreach循环中的每个文件,并使用system.io.file .NET类的Exists方法检查目标中是否存在文件名(而不是Fullname)。

如果没有,复制,只使用原始文件名(删除原始路径)。

在测试时,在副本上使用-whatif选项,因此它只显示它将做什么,以防结果不是您想要的:-)

票数 16
EN

Stack Overflow用户

发布于 2013-07-09 18:32:42

以前的答案对我来说似乎太复杂了,除非我误解了什么。这应该是可行的:

代码语言:javascript
运行
复制
Get-ChildItem "\\server\source\" *.doc -Recurse | ?{-not ($_.PSIsContainer -or (Test-Path "C:\Destination\$_"))} | Copy-Item -Destination "C:\Destination"

没有任何内置命令--复制、复制或机器人复制--都不会自己做您想做的事情,但是有一个名为xxcopy的实用工具可以方便地在http://www.xxcopy.com上使用。它有许多内置选项,专门用于将目录树扁平为单个目录。以下内容将如你所述:

代码语言:javascript
运行
复制
xxcopy "\\server\source\*.doc" "C:\Destination" /SGFO

但是,除了复制第一个遇到的文件名之外,xxcopy还有其他各种处理重复文件名的选项,例如将源目录名称添加到文件名,或者向除第一个文件名以外的所有文件名添加顺序数字标识,或者添加除最新或最旧文件名以外的所有文件名。有关详细信息,请参阅此页面:http://www.xxcopy.com/xxcopy16.htm

票数 7
EN

Stack Overflow用户

发布于 2013-07-09 08:04:31

代码语言:javascript
运行
复制
# Get all *.doc files under \\server\source
Get-ChildItem -Path \\server\source *.doc -Recurse |
    # Filter out directores
    Where-Object { -not $_.PsIsContainer } | 
    # Add property for destination
    Add-Member ScriptProperty -Name Destination -Value { Join-Path 'C:\destination' $this.Name } -PassThru |
    # Filter out files that exist on the destination
    Where-Object { -not (Test-Path -Path $_.Destination -PathType Leaf } | 
    # Copy. 
    Copy-Item
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17497667

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档