Administrar mis archivos de copia de seguridad de PowerShell
El mes pasado comencé un proyecto para comenzar a realizar copias de seguridad de carpetas críticas. Este proceso de copia de seguridad no es más que otra opción de restauración en caso de que la necesite. Aún así, ha estado funcionando durante más de un mes y ahora tengo varios archivos de respaldo completos. No necesito conservarlos todos. Si conservo las 4 copias de seguridad completas más recientes, debería ser suficiente. Así es como administro este proceso usando PowerShell.
Cuando creo un archivo de copia de seguridad completo, se copia en un recurso compartido en mi dispositivo Synology NAS. Esto es lo que tengo ahora.
Si recuerda, cada nombre de archivo incluye lo que es en esencia una descripción establecida; Scripts y Dropbox, por ejemplo. Es bastante fácil ordenar los archivos según la última hora de escritura y luego eliminarlos en consecuencia. Tengo 5 conjuntos y podría ejecutar esto:
Get-childitem -Path "\\ds416\backup\20*-full.rar" |
Sort-Object -Property LastWriteTime -Descending |
Select-Object -Skip 20
Estos deberían ser los archivos más antiguos que puedo eliminar. Sin embargo, no quiero hacer ninguna suposición. ¿Qué pasa si una copia de seguridad completa no se completó en una semana o ejecuté manualmente una copia de seguridad completa adicional? Necesito un enfoque más sofisticado. Vamos a empezar de nuevo.
Primero, obtenga todos los archivos de respaldo.
$files = Get-ChildItem -Path "\\ds416\backup\20*-full.rar" -file
A continuación, utilizando un patrón de expresión regular para extraer el nombre del conjunto de copia de seguridad, agrupo los archivos.
$grouped = $files | Group-Object -property { ([regex]"(?<=_)\w+(?=-)").match($_.BaseName).value }
La expresión regular busca texto precedido por un _ y seguido de un -. Se trata de mirar hacia atrás y mirar hacia adelante.
Ahora puedo procesar cada grupo, ordenar los archivos y eliminar los más antiguos.
foreach ($item in $grouped) {
$item.group | Sort-Object -property LastWriteTime -descending | Select-Object -skip 4 | Remove-Item -WhatIf
}
Aquí está mi script de PowerShell de recorte de copia de seguridad completo.
#MyBackupTrim.ps1
#trim full backups to the last X number of files
[cmdletbinding(SupportsShouldProcess)]
Param(
[Parameter(Position = 0, HelpMessage = "Specify the backup folder location")]
[ValidateNotNullOrEmpty()]
[ValidateScript({Test-Path $_ })]
[string]$Path = "\\ds416\backup",
[Parameter(HelpMessage = "Specify a file pattern")]
[ValidateNotNullOrEmpty()]
[string]$Pattern = "*-FULL.rar",
[Parameter(HelpMessage = "Specify the number of the most recent files to keep")]
[Validatescript({ $_ -ge 1 })]
[int]$Count = 4
)
$find = Join-Path -Path $path -ChildPath $pattern
Write-Verbose "Finding backup files from $Find"
Try {
$files = Get-ChildItem -Path $find -file -ErrorAction Stop
}
Catch {
Throw $_
}
if ($files.count -gt 0) {
Write-Verbose "Found $($files.count) backup files"
# group the files based on the naming convention
# like 20191108_documents-FULL.rar and 20191108_Scripts-FULL.rar
# but make sure there are at least $Count number of files
$grouped = $files | Group-Object -property { ([regex]"(?<=_)\w+(?=-)").match($_.BaseName).value } | Where-Object { $_.count -gt $count}
if ($grouped) {
foreach ($item in $grouped) {
Write-Verbose "Trimming $($item.name)"
$item.group | Sort-Object -property LastWriteTime -descending | Select-Object -skip $count | Remove-Item
}
}
else {
Write-Host "Not enough files to justify cleanup." -ForegroundColor magenta
}
}
#End of script
Puedo agregar este script al final de mi script de copia de seguridad semanal y eliminar archivos antiguos. Puedo revisar periódicamente mis carpetas de respaldo manualmente para verificar que solo conservo lo que realmente necesito. De lo contrario, puedo relajarme y dejar que PowerShell haga el trabajo por mí.