如何在保留目录结构的同时仅复制每个文件夹和子文件夹中的最新文件?

时间:2016-02-23 20:10:19

标签: powershell get-childitem copy-item

我正在使用一个结构为:account name→year→files。

的目录

在按年份和名称的每组文件中,通常有一个或多个文件在文件名中包含"*Data Rec*"。我只想为每组文件使用该名称的最新文件。现在我有以下代码可以工作,但只返回一个文件,即使有一个2012,2013和2014年的文件夹,每个文件夹至少包含一个"*Data Rec*"文件。它也不保留目录结构。它只将文件放入目标。该文件来自2014文件夹,因此我希望我的目标包含内置"*Data Rec*"文件的2014文件夹。

Get-ChildItem -Path $path -Recurse -Filter "*Data Rec*" |
  Sort-Object LastAccessTime -Descending |
  Select-Object -First 1 |
  % { Copy-Item -Path $_.FullName -Destination $destination }

最终,如果所选文件夹不包含"*Analysis*"文件,我还希望能够搜索最新的"*Data Rec*"文件。

2 个答案:

答案 0 :(得分:1)

使用两个Get-ChildItem语句,一个用于枚举文件夹,另一个用于枚举每个文件夹中的文件。

Get-ChildItem -Path $path -Recurse -Directory | ForEach-Object {
  Get-ChildItem -File -Filter "*Data Rec*" |
    Sort-Object LastAccessTime -Descending |
    Select-Object -First 1 |
    Copy-Item -Destination $destination
}

如果您未使用PowerShell v3或更新版本,则需要使用-Directory过滤器替换参数-FileWhere-Object,以检查对象的PSIsContainer属性。

要保留文件夹结构,您需要从要复制的文件的完整路径中删除$path并将其附加到目标路径。

{ Join-Path $destination ($_.FullName.Replace("$path\", '')) }

答案 1 :(得分:0)

我知道这是一个坏消息,但是Ansgar上面发布的解决方案对我而言并不奏效。我必须对其进行调整,以使其正常工作。不确定我是否应该将其发布为新答案或对他的答案的评论,所以如果我做错了,请告诉我以及如何解决!

这是我最终使用的代码。它获取每个子目录中的最新文件,并将其复制到目标位置。如果目标目录不存在,它还会首先创建目标目录。我不确定如何使脚本使用多行,所以看起来很难看-对不起!最后,在原始示例中,该人正在搜索与我搜索的术语不同的词(我搜索了“ * bak”)-只需将搜索词替换为要搜索的词即可。

Get-ChildItem -Path $Path -Directory | ForEach-Object {Get-ChildItem -Path "$Path\$_" -File -Filter "*bak" | Sort-Object LastWriteTime -Descending | Select-Object -First 1 | Copy-Item -Force -Destination (New-Item -Force -Type Directory -Path (Join-Path $DestinationPath ($_.FullName.Replace("$Path\", ''))))}

在理想情况下,脚本不会复制该文件(如果已存在)。这是可行的,只需删除-Force,但是如果我这样做,它会吐出难看的错误消息。不过,也许这比覆盖更好。但是,奇怪的是,如果目标文件名存在,Copy-Item不允许选项明确不复制。