Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   Удаление всех файлов в папке бекап - кроме первой записи каждого месяца (http://forum.oszone.net/showthread.php?t=331832)

fabble86@vk 12-12-2017 08:12 2783830

Удаление всех файлов в папке бекап - кроме первой записи каждого месяца
 
Вложений: 1
Добрый день! Много пытался читать на форуме информации по необходимой мне информации, но в итоге всё рядом, но опыта не хватает всё собрать воедино, и реализовать.
Если вкратце, есть папка с бекапом, которая каждый день (ночью) - добавляет бекап за предыдущий день. В итоге за месяц получается 30 (28,31) - файлов с бекапом.

Необходимо - удалить все файлы, как с расширением бекапа, так и любые другие, включая .txt (любые) - кроме первой даты каждого месяца.
Останется за год - грубо говоря 12 файлов. (если например говорить за 2016 год). Останется 2017_01_01_dbbuh2014.dt , потом 2017_02_01_dbbuh2014.dt - ну и так далее.
Скрин с папкой самой прилагаю. Нужно чтобы данный батник работал в конкретной папке. Чтобы другие папки в данной папке не трогал.

Заранее буду признателен Вам за помощь.

Iska 12-12-2017 09:00 2783836

fabble86@vk, для одноразового действия скрипты не нужны.

Far Manager, переходите в каталог, нажимаете серый плюс (на цифровой клавиатуре справа), вводите маску:
Код:

*.*|/\d{4}_\d{2}_01_dbbuh2014.dt/
нажимаете Ctrl-Enter, тем самым выделяя «лишние» файлы. Убедившись, что выделение верно, нажимаете Shift-Del, Enter.

fabble86@vk 12-12-2017 09:08 2783840

Цитата:

Цитата Iska
для одноразового действия скрипты не нужны. »

Увы, но это не одноразовое действие. Таких папок у нас много, и файлов соответстенно много. Плюс в данных папках много лишних ТХТ файлов и прочих не нужных вещей. А что именно нужно оставить в данной папке я писал Выше. Это можно как-то реализовать, не указывая путь, а чтобы батник работал в конкретной папке, в которой он находится.... ?

Iska 12-12-2017 09:40 2783846

Цитата:

Цитата fabble86@vk
Увы, но это не одноразовое действие. Таких папок у нас много, и файлов соответстенно много. Плюс в данных папках много лишних ТХТ файлов и прочих не нужных вещей. А что именно нужно оставить в данной папке я писал Выше. »

Одноразовое. Просто Вы, видимо, любите усложнять.

Ну, если не хотите пользовать Far Manager — вот Вам код на PowerShell:
Код:

@(
    'C:\Мои проекты\0137',
    'C:\Мои проекты\0138',
    'C:\Мои проекты\0139'
) | ForEach-Object -Process {
    if(Test-Path -LiteralPath $_ -PathType Container) {
        Get-ChildItem -LiteralPath $_ -File | ForEach-Object -Process {
                if($_.Name -notmatch '^\d{4}_\d{2}_01_dbbuh2014.dt$') {
                    Remove-Item -LiteralPath $_.FullName -WhatIf
                }
            }
    } else {
        Write-Host "Can't find source folder [$_]." -ForegroundColor Red
    }
}

В начале перечисляете все потребные каталоги. Маска — та же. Запускаете, смотрите, что предлагается удалить. Если всё нормально — убираете параметр -WhatIf у командлета Remove-Item для реального удаления.

fabble86@vk 12-12-2017 09:51 2783848

Цитата:

Цитата Iska
Ну, если не хотите пользовать Far Manager — вот Вам код на PowerShell: »

Для полной ясности, подскажите, если я данный код "запихну" в блокнот, сохранив как батник, он отработает как нужно?

Цитата:

Цитата Iska
'C:\Мои проекты\0137',
'C:\Мои проекты\0138',
'C:\Мои проекты\0139' »

Это путь к указанным файлам где будет производиться удаление?

Цитата:

Цитата Iska
В начале перечисляете все потребные каталоги. Маска — та же. Запускаете, смотрите, что предлагается удалить. Если всё нормально — убираете параметр -WhatIf у командлета Remove-Item для реального удаления. »

А что если у меня в 1 папке - 365 файлов, в этой же папке еще с десяток папок, и в каждой из них еще по 365 файлов. Не удалит ли он мне те папки, и их содержимое, если в них не содержится данных бекапа за 1 число. А там лежат файлы бекапа за 10-е числа...?

Я поэтому и хотел это в формате батника, чтобы реализация была конкретно в 1 папке. Так мне кажется безопасней.

Цитата:

Цитата Iska
Одноразовое. Просто Вы, видимо, любите усложнять. »

Я согласен что оно одноразовое, НО для одной конкретной папки. А что если у нас их действительно много? Не 5, и не 10. Просто само действие будет однотипно для всех папок...

Iska 12-12-2017 10:06 2783851

Цитата:

Цитата fabble86@vk
Для полной ясности, подскажите, если я данный код "запихну" в блокнот, сохранив как батник, он отработает как нужно? »

Нет, не отработает. Вам нужно сохранить его в файл с расширением .ps1, плюс однократно разрешить для PowerShell'а исполнение неподписанных локальных скриптов (Set-ExecutionPolicy -ExecutionPolicy RemoteSigned).

Цитата:

Цитата fabble86@vk
Это путь к указанным файлам где будет производиться удаление? »

Пути к каталогам с искомыми файлами. Вместо них Вы вписываете потребное количество своих путей.

Цитата:

Цитата fabble86@vk
А что если у меня в 1 папке - 365 файлов, в этой же папке еще с десяток папок, и в каждой из них еще по 365 файлов. Не удалит ли он мне те папки, и их содержимое, »

Вложенные каталоги и файлы в них не участвуют в обработке, поскольку для командлета Get-ChildItem не указан булевый параметр -Recurse. Сами каталоги вообще не подвергаются какой-либо обработке, поскольку используется параметр -File. Например, если в каком-либо из указанных Вами каталогов окажется каталог с именем «2017_01_02_dbbuh2014.dt» — он не будет удалён.

Цитата:

Цитата fabble86@vk
Я поэтому и хотел это в формате батника, чтобы реализация была конкретно в 1 папке. Так мне кажется безопасней. »

Цитирую сам себя:
Цитата:

Цитата Iska
Запускаете, смотрите, что предлагается удалить. Если всё нормально — убираете параметр -WhatIf у командлета Remove-Item для реального удаления. »

То есть — данный скрипт в неизменном виде вообще ничего не удаляет. И не будет удалять, а только показывать, что он будет удалять, когда Вы уберёте из кода параметр -WhatIf.

Цитата:

Цитата fabble86@vk
А что если у нас их действительно много? Не 5, и не 10. »

Хоть пять тысяч. Просто перечисляете их там, где я указал.

megaloman 12-12-2017 13:21 2783886

Цитата:

Цитата fabble86@vk
Нужно чтобы данный батник работал в конкретной папке. »

Указывайте конкретные папки и маску в Call :DirBack
Код:

@Echo Off

Call :DirBack "Z:\Box_Arc\Папка с бэкапами 1\" "20??_??_??_*.dt"
Call :DirBack "Z:\Box_Arc\Папка с бэкапами 2\" "20??_??_??_*.dt"
Call :DirBack "Z:\Box_Arc\Папка с бэкапами 3\" "20??_??_??_*.dt"

GoTo :Eof

:DirBack
        Set "Last="
        Set "Ext="
        FOR /F "usebackq tokens=1,2,3* delims=_" %%i IN (`Dir /B /A:-D /O:EN "%~1%~2" 2^>nul`) DO Call :DelBack "%~1" "%%i" "%%j" "%%k" "%%l"
GoTo :Eof

:DelBack
        If "%Last%"=="%~2%~3" If "%Ext%"=="%~x5" Del "%~1%~2_%~3_%~4_%~5" &GoTo :Eof
        Set "Last=%~2%~3"
        Set "Ext=%~x5"
GoTo :Eof

Цитата:

Цитата fabble86@vk
а чтобы батник работал в конкретной папке, в которой он находится.... ? »

В этом случае оставьте один
Call :DirBack
Код:

Call :DirBack "%~dp0" "20??_??_??_*.dt"
Если в папке находятся файлы по датам с разным расширением, и по каждому расширению надо оставить только один файл за месяц, укажите маску
"20??_??_??_*.*"

fabble86@vk 12-12-2017 14:50 2783906

Цитата:

Цитата megaloman
В этом случае оставьте один
Call :DirBack »

Прописал так. Поменял только путь, и оставил один DirBack, но не работает почему-то... проверяю файл на бекапе от бекапа , скажем так. чтобы случайно не удалить то что нельзя удалять)

@Echo Off

Call :DirBack "C:\Users\s.andrashenko\Desktop\New" "20??_??_??_*.dt"

GoTo :Eof

:DirBack
Set "Last="
FOR /F "usebackq tokens=1,2,3* delims=_" %%i IN (`Dir /B /A:-D /O:N "%~1%~2" 2^>nul`) DO Call :DelBack "%~1" "%%i" "%%j" "%%k" "%%l"
GoTo :Eof

:DelBack
If Not "%Last%"=="%~2%~3" Set "Last=%~2%~3" &GoTo :Eof
echo Del "%~1%~2_%~3_%~4_%~5"
GoTo :Eof

Цитата:

Цитата megaloman
fabble86@vk, Я изменял скрипт для расширения функционала, используйте посленюю версию »

почему то не работает(

megaloman 12-12-2017 18:02 2783951

Я организовал у себя Вашу папку, добавил в скрипт некоторую защиту от неверных данных. У меня работает. Пробуйте
Код:

@Echo Off

Call :DirBack "C:\Users\s.andrashenko\Desktop\New" "20??_??_??_*.dt"

GoTo :Eof

:DirBack
        If Not Exist %1 (Echo Folder not found %1 &Pause &GoTo :Eof)
        Set "InDir=%~1"
        If Not "%InDir:~-1%"=="\" Set "InDir=%InDir%\"
        Set "Last="
        Set "Ext="
        FOR /F "usebackq tokens=1,2,3* delims=_" %%i IN (`Dir /B /A:-D /O:EN "%Indir%%~2" 2^>nul`) DO Call :DelBack "%Indir%" "%%i" "%%j" "%%k" "%%l"
GoTo :Eof

:DelBack
        If "%Last%"=="%~2%~3" If "%Ext%"=="%~x5" Del "%~1%~2_%~3_%~4_%~5" &GoTo :Eof
        Set "Last=%~2%~3"
        Set "Ext=%~x5"
GoTo :Eof


fabble86@vk 13-12-2017 06:42 2784054

Цитата:

Цитата megaloman
Я организовал у себя Вашу папку, добавил в скрипт некоторую защиту от неверных данных. У меня работает. Пробуйте »


Проверил, действительно работает. Спасибо

Цитата:

Цитата megaloman
Я организовал у себя Вашу папку, добавил в скрипт некоторую защиту от неверных данных. У меня работает. Пробуйте »

А еще один вопрос. Можно как-нибудь дописать строчку про удаление остальных файлов расширения .txt - поскольку они там тоже встречаются, но они вообще никакие не нужны. Главное это бекапы которые вы сделали. Спасибо.

И если можно данную строчку дописать. то куда её там вставить..

megaloman 13-12-2017 11:58 2784084

fabble86@vk
Можно как-нибудь дописать строчку про удаление остальных файлов расширения .txt
Код:

@Echo Off

Call :DirBack "C:\Users\s.andrashenko\Desktop\New" "20??_??_??_*.dt" "txt"

GoTo :Eof

:DirBack
        If Not Exist %1 (Echo Folder not found %1 &Pause &GoTo :Eof)
        Set "InDir=%~1"
        If Not "%InDir:~-1%"=="\" Set "InDir=%InDir%\"
        If Not "%~3"=="" FOR %%i IN (%~3) DO Del "%Indir%*.%%~i" 2>nul
        Set "Last="
        Set "Ext="
        FOR /F "usebackq tokens=1,2,3* delims=_" %%i IN (`Dir /B /A:-D /O:EN "%Indir%%~2" 2^>nul`) DO Call :DelBack "%Indir%" "%%i" "%%j" "%%k" "%%l"
GoTo :Eof

:DelBack
        If "%Last%"=="%~2%~3" If "%Ext%"=="%~x5" Del "%~1%~2_%~3_%~4_%~5" &GoTo :Eof
        Set "Last=%~2%~3"
        Set "Ext=%~x5"
GoTo :Eof

Можно указать несколько расширений для удаления,
Код:

Call :DirBack "C:\Users\s.andrashenko\Desktop\New" "20??_??_??_*.dt" "txt jpg doc"
или, как и ранее, не удалять все файлы определённого расширения
Код:

Call :DirBack "C:\Users\s.andrashenko\Desktop\New" "20??_??_??_*.dt"

sNc-DAntES 13-12-2017 12:28 2784095

Если это семёрка и выше, то можно с помощью robocopy.

Код:

set robotemp=d:\!BackUp\robotemp
MD %robotemp%
ROBOCOPY %Путь к вашей папке% %robotemp% /move /minage:30
del %robotemp% /q


fabble86@vk 13-12-2017 12:34 2784098

Цитата:

Цитата megaloman
@Echo Off
Call :DirBack "C:\Users\s.andrashenko\Desktop\New" "20??_??_??_*.dt" "txt"
GoTo :Eof
:DirBack
If Not Exist %1 (Echo Folder not found %1 &Pause &GoTo :Eof)
Set "InDir=%~1"
If Not "%InDir:~-1%"=="\" Set "InDir=%InDir%\"
If Not "%~3"=="" FOR %%i IN (%~3) DO Del "%Indir%*.%%~i" 2>nul
Set "Last="
Set "Ext="
FOR /F "usebackq tokens=1,2,3* delims=_" %%i IN (`Dir /B /A:-D /O:EN "%Indir%%~2" 2^>nul`) DO Call :DelBack "%Indir%" "%%i" "%%j" "%%k" "%%l"
GoTo :Eof
:DelBack
If "%Last%"=="%~2%~3" If "%Ext%"=="%~x5" Del "%~1%~2_%~3_%~4_%~5" &GoTo :Eof
Set "Last=%~2%~3"
Set "Ext=%~x5"
GoTo :Eof »

Cпасибо большое


Время: 13:48.

Время: 13:48.
© OSzone.net 2001-