Копировать на основе даты последнего изменения файлов

Вопрос или проблема

Я хочу скопировать из исходной папки dir в желаемое место назначения, как показано ниже.

Исходная папка:

--Dummy
----dirA (содержит файлы, измененные 2/7/2015)
----dirB (содержит файлы, измененные 3/7/2015)
----dirC (содержит файлы, измененные 18/7/2015)
----dirD (содержит файлы, измененные 18/7/2015)
----dirE (содержит файлы, измененные 2/7/2015)

Каждая dir выше в Dummy содержит файлы с конкретной датой последнего изменения

Папка назначения должна выглядеть следующим образом:

--Dummy2015-07-2
----dirA (содержит файлы, измененные 2/7/2015)
----dirE (содержит файлы, измененные 2/7/2015)

--Dummy2015-07-3
----dirB (содержит файлы, измененные 3/7/2015)

--Dummy2015-07-18
----dirC (содержит файлы, измененные 18/7/2015)
----dirD (содержит файлы, измененные 18/7/2015)

До сих пор, ссылаясь на здесь, я смог создать что-то вроде этого:

$sourcePath="c:/dummy"
$destPath="e:/dummy"  

Get-ChildItem -recurse -Path $sourcePath | Group {$_.LastWriteTime.ToString("yyyy-MM-dd")} | 
 Foreach-Object{
     $folder = New-Item -Path "$($destPath)$($_.Name)" -ItemType Directory -Force
     $_.Group | Where-Object { -not (Test-Path "$($folder.FullName)\$($_.Name)") } | Copy-Item -Destination $folder.FullName 
}

Но приведенный выше код напрямую копирует файлы из папки исходного дубликата, что делает папку назначения следующей:

--Dummy2015-07-2
----(все файлы из dirA & dirE)

--Dummy2015-07-3
----(все файлы из dirB)

--Dummy2015-07-18
----(все файлы из dirC & dirD)

(если возможно, хотелось бы сделать это с помощью robocopy)

Содержит ли dirA только файлы, измененные 2015.07.02? Или она содержит файлы, измененные раньше? В своем ответе я предполагаю первое. Я также буду предполагать, что каждая папка содержит только файлы или папки, которые вы хотите связать с этой же папкой (т.е. вы не переместите их из родительской папки).

Ниже приведен код, который должен работать. Заполните первые 2 переменные.
И эй, он использует robocopy! 🙂

$PathToRootOfDummy = "C:\path\to\dummy\root"
$PathToReplacementPrefix = "C:\path\to\dummy_new-" # дата идет после '-'

Get-ChildItem $PathToRootOfDummy | Where-Object {$_.PSISContainer -eq $true} | ForEach-Object {
    $nf = "$PathToReplacementPrefix$($(Get-ChildItem -Path $PathToRootOfDummy\$($_.Name) | Where { ! $_.PSIsContainer} )[0].LastWriteTime.tostring("yyyy-MM-dd"))"
    mkdir $nf
    robocopy -s -e $PathToRootOfDummy\$_ $nf
}

Ответ или решение

Копирование файлов на основе даты последнего изменения с использованием PowerShell и Robocopy

Введение

Вам необходимо организовать файлы из нескольких подкаталогов в новую структуру директории на основе их даты последнего изменения. Важно правильно сгруппировать файлы так, чтобы файлы, модифицированные в одну и ту же дату, находились в одном и том же каталоге. В этом руководстве мы рассмотрим, как это сделать с помощью PowerShell и Robocopy.

Исходные данные

Исходная директория:

--Dummy
----dirA (файлы последнего изменения 2/7/2015)
----dirB (файлы последнего изменения 3/7/2015)
----dirC (файлы последнего изменения 18/7/2015)
----dirD (файлы последнего изменения 18/7/2015)
----dirE (файлы последнего изменения 2/7/2015)

Структура целевой директории:

--Dummy2015-07-02
----dirA
----dirE

--Dummy2015-07-03
----dirB

--Dummy2015-07-18
----dirC
----dirD

Решение с использованием PowerShell и Robocopy

Вы можете использовать следующий скрипт PowerShell для достижения ваших целей. Скрипт организует файлы в структуру директорий на основе даты их последнего изменения:

$sourcePath = "C:\path\to\Dummy"
$destPath = "E:\path\to\DummyNew-" # добавьте дату после '-'

# Получаем все подкаталоги в исходной директории
Get-ChildItem -Path $sourcePath -Directory | ForEach-Object {
    $lastModifiedDate = (Get-ChildItem -Path $_.FullName | Where-Object { -not $_.PSIsContainer }).LastWriteTime.ToString("yyyy-MM-dd")
    $destinationDir = Join-Path -Path $destPath -ChildPath $lastModifiedDate

    # Создаем новую директорию на основе даты последнего изменения
    if (-not (Test-Path $destinationDir)) {
        New-Item -Path $destinationDir -ItemType Directory
    }

    # Копируем файлы в соответствующий каталог
    robocopy $_.FullName $destinationDir /E /COPY:DAT /NFL /NDL
}

Объяснение кода

  1. Определение путей: Мы задаем пути к исходной и целевой директориям. Обратите внимание, что целевой путь содержит базу для нового имени директории.

  2. Получение подкаталогов: Используется Get-ChildItem для получения всех подкаталогов из исходной директории.

  3. Получение даты последнего изменения: Для каждого подкаталога вычисляется дата последнего изменения, используя LastWriteTime.

  4. Создание новой директории: Если директория не существует, она создаётся с помощью New-Item.

  5. Копирование файлов: Используется Robocopy, чтобы скопировать файлы из исходного подкаталога в новую директорию. Опции /E и /COPY:DAT обеспечивают полное копирование директорий и соответствующих атрибутов.

Примечание

Убедитесь, что у вас есть необходимые разрешения на доступ к директориям и что выполняется скрипт с соответствующими правами.

Заключение

Данный подход позволяет автоматически организовать ваши файлы в новой структуре директорий на основе даты последних изменений. Использование PowerShell в сочетании с Robocopy предоставляет мощный инструмент для облегчения задач администрирования файлов в Windows. Если у вас есть дополнительные вопросы или вам требуется дальнейшая помощь, не стесняйтесь обращаться.

Оцените материал
Добавить комментарий

Капча загружается...