Найдите папки, созданные после даты X, и скопируйте их
Мне нужно пройти через большую папку (назовем ее D:\Files), которая содержит около 50000 папок и около 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.
В последние два дня я пытался дозвониться, но до сих пор с треском провалился.
Я знаю, что, возможно, с Powershell это нелегко, поскольку для этого требуется несколько шагов, но любая помощь будет принята с благодарностью.
Спасибо.
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
}
}
Вам следует подумать об использовании robocopy.exe для решения этой задачи.
Если вы ищете решение для PS, взгляните на представленные в скрипте 2013 игры 1