PDA

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


myp3ujlka
14-01-2022, 13:06
Доброго времени суток!
Нужно удалить все файлы кроме последнего за каждый месяц.
Есть список файлов вида

file_2021_10_20.zip
file_2021_10_21.zip
file_2021_10_22.zip
file_2021_10_23.zip
file_2021_10_24.zip
file_2021_10_25.zip
file_2021_10_26.zip
file_2021_10_27.zip
file_2021_10_28.zip
file_2021_10_29.zip
file_2021_10_30.zip
file_2021_10_31.zip
file_2021_11_01.zip
file_2021_11_02.zip
file_2021_11_03.zip
file_2021_11_04.zip
file_2021_11_05.zip
file_2021_11_06.zip
file_2021_11_07.zip
file_2021_11_08.zip
file_2021_11_09.zip
file_2021_11_10.zip
file_2021_11_11.zip
file_2021_11_12.zip
file_2021_11_13.zip
file_2021_11_14.zip
file_2021_11_15.zip
file_2021_11_16.zip
file_2021_11_17.zip
file_2021_11_18.zip
file_2021_11_19.zip
file_2021_11_20.zip
file_2021_11_21.zip
file_2021_11_22.zip
file_2021_11_23.zip
file_2021_11_24.zip
file_2021_11_25.zip
file_2021_11_26.zip
file_2021_11_27.zip
file_2021_11_28.zip
file_2021_11_29.zip
file_2021_11_30.zip
file_2021_12_01.zip
file_2021_12_02.zip
file_2021_12_03.zip
file_2021_12_04.zip
file_2021_12_05.zip
file_2021_12_06.zip

и.т.д. за 1 год. Нужно удалить все кроме

file_2021_10_31.zip
file_2021_11_30.zip

ориентируясь на дату

DJ Mogarych
14-01-2022, 13:55
Powershell:

dir 'D:\temp\del\*.zip' |group {$_ -replace '.*(\d{4}_\d{2}).*','$1'} |sort name |select -SkipLast 1 |% {$_.group |sort name |select -SkipLast 1 |del}


"Батник":

powershell -command "dir 'D:\temp\del\*.zip' |group {$_ -replace '.*(\d{4}_\d{2}).*','$1'} |sort name |select -SkipLast 1 |% {$_.group |sort name |select -SkipLast 1 |del}"

myp3ujlka
14-01-2022, 15:52
Спасибо! То что нужно!
Возможно так лучше? Чтобы привязываться к дате независимо от имени файла.

dir |group {$_.LastWriteTime.ToString("MM")} |% {$_.group |sort LastWriteTime |select -SkipLast 1|del}

DJ Mogarych
14-01-2022, 16:14
Если группировать только по месяцу, а файлы будут за несколько лет, то останется только один файл за последний год этого месяца.

К тому же, вы убрали фильтр последней группы - это приведёт к тому, что будут затираться и файлы текущего месяца.

Что касается сортировки по времени - это можно, но в именах файлов уже есть дата, дело вкуса.

megaloman
16-01-2022, 17:10
CMD для 2000 ... 2050 года@Echo Off
cls
Set "BoxIn=Z:\Box_In"
Set "Prefix=Имя файла эх ма тру ля ля_"
Set "Ext=.Zip"

FOR /L %%y IN (2000,1,2050) DO If Exist "%BoxIn%\%Prefix%%%y_*%Ext%" (
For %%m In (01 02 03 04 05 06 07 08 09 10 11 12) Do (
FOR /F "usebackq skip=1 delims=" %%f In (`2^>nul Call Dir /B /A:-D /O:-N "%BoxIn%\%Prefix%%%y_%%m_??%Ext%"`) DO (
Del "%BoxIn%\%%f"
)
)
)
pause
Exit /B

mariolast
29-11-2022, 02:49
Как подкорректировать скрипт, чтобы из такого списка
2022-11-26-04-14_11.02.089.ZBF
2022-11-27-04-14_11.02.089.ZBF
2022-11-28-04-14_11.02.089.ZBF
....
оставался всегда только один самый новый?

DJ Mogarych
29-11-2022, 10:16
Powershell

dir 'D:\temp\logs' |sort name |select -SkipLast 1 |del

"Батник"

powershell -command "dir 'D:\temp\logs' |sort name |select -SkipLast 1 |del"

megaloman
29-11-2022, 12:30
@Echo off
Set "BoxIn=Z:\Soft_Arc"
Set "Mask=20??-??-??-??-??_??.??.???.ZBF"

Pushd "%BoxIn%"|| (Echo Folder "%BoxIn%" not found &Pause &Exit /B 2)
FOR /F "usebackq skip=1 delims=" %%i In (`2^>nul Dir /B /A:-D /O:-N "%Mask%"`) DO Del "%%i"
Exit /B




© OSzone.net 2001-2012