Найдите папки, созданные после даты X, и скопируйте их

Мне нужно пройти через большую папку (назовем ее D: \ Files), которая содержит около 50 000 папок и около 1 миллиона файлов, и скопировать все папки, которые были созданы (не изменены) после 31 августа 2012 года, включая все в их подпапках ( включая вложенные папки второго / третьего / четвертого уровня и т. д.) и файлы (также файлы во вложенных папках, независимо от того, когда они были изменены) в этих папках, независимо от того, когда они были созданы, если они находятся в более высоком up ", созданную после августа, на другой диск (назовите ее E: \ Space) - все еще сохраняя исходную структуру папок, поэтому файл, который раньше находился в D: \ Files \ Folder1 \ Subfolder3 \ hello.txt, должен быть в E: \ Space \ Folder1 \ Subfolder3 \ hello.txt

Фон состоит в том, что некоторые папки были созданы в структуре после августа, но файлы в них имеют более старую дату изменения, и мне нужно включить в процесс поиска все, что было добавлено в D: \ Files после 31 августа 2012 года, чтобы я мог Я не понимаю, какие файлы были добавлены недавно, а какие были там уже до августа, и мне нужно найти дату создания папки.

Итак, если папка D: \ Files \ Folder1 была создана в сентябре, то файлы и папки в ней - будь то на один, два, три, четыре и т.д. уровня, независимо от того, когда она была изменена / модифицирована, должны быть перемещены в E: \ Пробел с командной оболочкой.

В последние два дня я пытался дозвониться, но пока безуспешно.

Я знаю, что это, вероятно, непросто с Powershell, поскольку для этого требуется несколько шагов, но любая помощь будет принята с благодарностью.

Огромное спасибо.


person Roland    schedule 16.05.2013    source источник
comment
И .... что ты пробовал ??   -  person CB.    schedule 16.05.2013
comment
Я не уверен, как этот вопрос связан с языками программирования. Не похоже, что подходит для SO.   -  person Marcelo De Polli    schedule 16.05.2013


Ответы (2)


Попробуйте что-то вроде этого:

$srcRoot = "D:\Files"
$dstRoot = "D:\Space"

$ct = Get-Date "2012-09-01"

Get-ChildItem -Recurse $srcRoot | ? {
  $_.PSIsContainer -and $_.CreationTime -ge $ct
} | sort FullName | % {
  $name = $_.FullName
  if ($top -eq $null) {
    $top = $name
  } elseif ( $name.substring(0, [math]::Min($top.Length, $name.Length)) -ne $top ) {
    $top = $name
    $dst = $_ -replace [regex]::Escape($srcRoot), $dstRoot
    Copy-Item $name $dst -Recurse -Force
  }
}
person Ansgar Wiechers    schedule 16.05.2013

Вам следует подумать об использовании robocopy.ex для решения этой задачи.

Если вы ищете решение для ps, обратите внимание на материалы, представленные на Scriptgames 2013 Event 1

person icnivad    schedule 16.05.2013
comment
robocopy не соответствует его требованиям. Он хочет скопировать совпадающие папки со всем их содержимым, тогда как robocopy работает для отдельных файлов. - person Ansgar Wiechers; 17.05.2013