Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Keep x number of files and delete all others - Powershell

I am trying to write a script that will look through a set of folders and keep only the last 10 files. The files in each folder could be created daily, weekly or monthly. I need the script to keep the 10 most recent copies regardless of the creation date or modified date.

Using another post I created the script below that works but it doesnt keep 10 copies it keeps any file that isn't older than 10 days.

$ftppath = "C:\Reports"
Get-ChildItem $ftppath -recurse *_Report_*.zip -force|where {$_.lastwritetime -lt (get-date).adddays(-10)} |Remove-Item -force

Any idea on how I can tweak this to work? If I use the script below it works but only if I dont set -Recurse. If you use the -Recurse switch you get an error that I have listed below the script.

# Keeps latest 10 files from a directory based on Creation Time

#Declaration variables
$path = "C:\Reports"                               # For example $path= C:\log\*.tmp
$total= (ls $path).count - 10 # Change number 5 to whatever number of objects you want to keep
# Script
ls $path |sort-object -Property {$_.CreationTime} | Select-Object -first $total | Remove-Item -force

Error: Select-Object : Cannot validate argument on parameter 'First'. The -7 argument is less than the minimum allowed range of 0. Supply an argument that is greater than 0 and then try the command again.

like image 780
mpowmap Avatar asked Sep 07 '25 14:09

mpowmap


1 Answers

You can sort by CreationTime descending and skip the first 10. If there are less than 10 files it will not remove any.

gci C:\temp\ -Recurse| where{-not $_.PsIsContainer}| sort CreationTime -desc| 
    select -Skip 10| Remove-Item -Force
like image 57
Rynant Avatar answered Sep 10 '25 11:09

Rynant