Speakeasys
Speakeasys

Reputation: 91

Delete All But The Newest File of Pattern In Each Subdirectory

Requirements:

  1. Iterate through all folders and files in each directory
  2. Delete all files in each subdirectory except for the newest one (contains filename time stamp) and has a specific filename pattern or instead copy the one file in each subdirectory that is the newest and that is preceded with LIVE_DATA. (There are other files in each subdirectory I wish to ignore).

    • Directory: AISI-301.0000000001006165.2015-08-24_23-57-46-1
    • File: LIVE_DATA_2015-08-24_23-57-51.413+0000.MCA

How can I iterate through all of the files recursively while doing comparisons between files in each subdirectory only? I don't want to compare all of them together. Just the one's inside each subdirectory.

for $filename in Get-ChildItem -recurse {
    for $filename in $directory {
        if ($filename > $filename2) {
            $temp = $filename
        }
        $filename2 = $filename1
    }
}

This is what I ended up using to rename my file's after the directory names. It appends the file name to the end and the directory name comes first. I hope this helps somebody else that might be searching for this solution.

    Get-ChildItem -include *LIVE_DATA_*.MCA -recurse | Rename-Item -NewName { $_.Directory.Name+'_'+$_.Name}

Upvotes: 1

Views: 2992

Answers (1)

Ansgar Wiechers
Ansgar Wiechers

Reputation: 200323

If you want to remove all files LIVE_DATA_* except the most recent one on a per-folder basis you could do something like this:

$root = 'C:\path\to\root\folder'

Get-ChildItem $root -Recurse | ? { $_.PSIsContainer } | ForEach-Object {
  Get-ChildItem (Join-Path $_.FullName 'LIVE_DATA_*') |
    Sort-Object Name -Desc |
    Select-Object -Skip 1 |
    Remove-Item -Force
}

Get-ChildItem $root -Recurse | ? { $_.PSIsContainer } lists all subfolders of $root. Then the ForEach-Object runs another Get-ChildItem statement (without recursion) for each subfolder separately. The Join-Path statement builds a wildcard path from the filename pattern and the full path to the folder (C:\path\to\root\folder\sub\folder\LIVE_DATA_*).

Basically the code lists all folders, then processes the files for each individual folder.

Upvotes: 4

Related Questions