Удалить X-файлы в каждой папке и подпапках - PullRequest
0 голосов
/ 20 февраля 2020

Я хочу удалить файлы в папке и ее подпапках, но не X последние файлы снова в каждой папке. Например, в C:\Test я хочу сохранить 10 текстовых файлов, но также в C:\Test\subtest1 и C:\Test\subtest2. Здесь X X - это количество файлов, которые я хочу сохранить.

Но при этом не будет сохранено 10 файлов в каждой папке, но во всей древовидности.

Мой сценарий не полностью функционален , но это хорошо сработало в каталоге C:\Test:

Set-ExecutionPolicy unrestricted $txtfiles = 'C:\Users\MUC8VX\Documents\Test
ForEach-Object {    Get-ChildItem $txtfiles | where{ -not $_.PsIsContainer}|
     sort LastWriteTime -desc| select -Skip 10 |
     Remove-Item -Include *.txt* -Force }

И если я добавлю -Recurse, он не будет хранить по 10 файлов в каждой папке, но во всей древовидности:

Set-ExecutionPolicy unrestricted
$txtfiles =`C:\Users\MUC8VX\Documents\Test'
ForEach-Object {    Get-ChildItem $txtfiles -Recurse | where{ -not
 $_.PsIsContainer}| sort LastWriteTime -desc|
     select -Skip 10 | Remove-Item -Include *.txt* -Force }

edit: Большое спасибо, Мануэль Батшинг.

Вот общий сценарий c:

#Insert your parent folder which contains files and subfolders

Get-Childitem -Path C:\Your\Parent\Folder -Recurse | 

Group-Object Directory | 
ForEach-Object { 
    $_.Group |

        #sort by the last written files 
        Sort-Object LastWriteTime -Descending |

        #Keep the X last files you want to keep 
        Select-Object -Skip X |

        #Remove files according to their extension
        Remove-Item -Include *.extension* -Force }

Ответы [ 2 ]

1 голос
/ 20 февраля 2020

Я не проверял, но вы можете попробовать это.

Set-ExecutionPolicy unrestricted
$txtfiles = 'C:\Users\MUC8VX\Documents\Test'
Get-ChildItem -Directory -Recurse -Path $txtfiles | ForEach-Object {
    Get-ChildItem -Path $_.fullname -Include *.txt | Sort-Object LastWriteTime -Descending | Select-Object -Skip 10 | Remove-Item -Force
}

По сути, этот код рекурсивно перебирает каждую папку, для каждой папки он находит файлы, пропускает 10 и удаляет все остальные.

0 голосов
/ 20 февраля 2020

Если вы ищете решение, которое также применимо к вложенным подпапкам, вы можете рекурсивно перечислить все файлы, а затем сгруппировать их по пути к соответствующей родительской папке. Затем примените свои правила сортировки и уменьшите каждую группу до 10 элементов.

Get-Childitem *.txt -Recurse | 
    Group-Object Directory | 
    ForEach-Object { 
        $_.Group | 
            Sort-Object LastWriteTime -Descending | 
            Select-Object -Skip 10 | 
            Remove-Item }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...