Форум программистов, компьютерный форум, киберфорум
Наши страницы
Batch (CMD/BAT)
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/5: Рейтинг темы: голосов - 5, средняя оценка - 5.00
kbv025
1 / 1 / 2
Регистрация: 03.04.2013
Сообщений: 48
1

Необходимо оставить в папке самые старые файлы и два самых новых

16.02.2014, 15:53. Просмотров 919. Ответов 4
Метки нет (Все метки)

Помогите с решением
Имеем папку с файлами архива.
В ней допустим есть 3 самых старых созданных файлов например за 10.02.14. И каждый день добавляется по одному файлу дополнения. Необходим батник чтобы периодически пробегал по всей папке и удалял промежуточные файлы. Оставляя при этом 3 самых старых и два новых за два дня.
Эти 3 никогда не трогаем
=============
file1 создан 10.02.14
file2 создан 10.02.14
file3 создан 10.02.14

=============
Эти надо удалить
file4 создан 11.02.14
file5 создан 12.02.14
file6 создан 13.02.14

====================
Эти надо оставить.
file7 создан 14.02.14
file8 создан 15.02.14

Файлы все одного расширения и создаются по одному в день.
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.02.2014, 15:53
Ответы с готовыми решениями:

Проверять папку на новые файлы архивы zip и переименовывать их при появлении новых в папке
Есть папка(скажем D:\arhiv)Она изначально пуста. При нажатии на кнопку...

Найти два самых больших и самых маленьких элементов массива
Одномерные массивы для обычных массивов и для класса Array. Составить...

В Документе "исчезают" Старые Поля При Добавлении Новых
Всем добрый день. Столкнулся с такой проблемой. После добавление...

Не сохраняются старые данные при введении новых в дбгрид
Имеется БД, в ней хранятся вопросы, ответы и результаты тестирования. В...

При выборе, заполнении новых записей в форме, старые записи исчезают
В форме Ф_ТС два поля со списком марка и модель, при выборе марки должны...

4
Dragokas
Эксперт WindowsАвтор FAQ
17053 / 7109 / 860
Регистрация: 25.12.2011
Сообщений: 10,920
Записей в блоге: 16
16.02.2014, 18:12 2
Bash
1
2
3
4
5
6
7
8
9
10
@echo off
SetLocal EnableExtensions EnableDelayedExpansion
set src=c:\papka
 
set c=0
For /F "Delims=" %%a in ('dir /TC /OD /B /A-D "%src%\*" 2^>NUL ^| more +3') do set /A c+=1& set "file.!c!=%%a"
if %c%==0 exit /B
set /A c-=2
 
For /L %%n in (1,1,%c%) do del /F /Q "%src%\!file.%%n!"
Не проверял.
1
kbv025
1 / 1 / 2
Регистрация: 03.04.2013
Сообщений: 48
16.02.2014, 19:50  [ТС] 3
Спасибо за ответ.
Проверил на копии папки.
Имеем
file создан 10.02.14
file1 создан 10.02.14

file2 создан 10.02.14
file3 создан 10.02.14
file4 создан 11.02.14
file5 создан 12.02.14
file6 создан 13.02.14
file7 создан 14.02.14

красным выделил то что удалилось. Захватил два нужных архива, и нужный последний.
Такой вопрос, скрипт берет дату создания или дату изменения файла?
0
sov44
1760 / 744 / 128
Регистрация: 09.04.2011
Сообщений: 1,314
16.02.2014, 20:48 4
kbv025, попробуйте
Bash
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
@echo off
setlocal enabledelayedexpansion
 
set tt=%date:~6,4%%date:~3,2%%date:~0,2%
:: дата минус два дня
set /a tt1=%tt%-2
 
:: сортируем файлы по дате от ранних к поздним, пропускаем первые три даты (три самых старых файла)
for /f "skip=3 delims=" %%a in ('dir /b /s /a-d /od "c:\1\CMDEXE_HELP\*"') do (
set dt=%%~ta
set dt1=!dt:~6,4!!dt:~3,2!!dt:~0,2!
if !dt1! LSS %tt1% echo del /q "%%a"
)
pause
exit /b
для реального удаления файлов убрать echo в 12 строке

Добавлено через 23 минуты
Выше код будет иметь ошибки при переходе даты (минус два дня) через ноль.
Так будет правильно
Bash
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
@echo off
setlocal enabledelayedexpansion
 
:: считаем по календарю два дня назад (чтобы не удалять двухдневные файлы)
set d=%date:~0,2%
set m=%date:~3,2%
set y=%date:~6,4%
 
if %d:~0,1%==0 set d=%d:~1%
if %m:~0,1%==0 set m=%m:~1%
 
set /a feb=y%%4
if %feb%==0 (set feb=29) else (set feb=28)
 
set /a tok=m-1
if %tok%==0 set tok=12
for /f "tokens=%tok%" %%i in ("31 %feb% 31 30 31 30 31 31 30 31 30 31") do (
   set /a d-=2
    if !d!==0 (
        set d=%%i
        set m=%tok%
        if !m!==12 set /a y-=1
    )
)
 
set d=0%d%
set m=0%m%
set tt=%d:~-2%.%m:~-2%.%y%
:: меняем представление даты
set tt1=%tt:~6,4%%tt:~3,2%%tt:~0,2%
 
:: сортируем файлы по дате от ранних к поздним, пропускаем первые три даты (файла)
for /f "skip=3 delims=" %%a in ('dir /b /s /a-d /od "c:\1\CMDEXE_HELP\*"') do (
set dt=%%~ta
set dt1=!dt:~6,4!!dt:~3,2!!dt:~0,2!
if !dt1! LSS %tt1% echo del /q "%%a"
)
pause
exit /b
1
kbv025
1 / 1 / 2
Регистрация: 03.04.2013
Сообщений: 48
16.02.2014, 23:01  [ТС] 5
sov44
Спасибо.
Проверил, удаляет нужное. Единственное, что начальных файлов которые нельзя трогать может быть разное количество, которое время от времени меняется. (необходимо обрабатывать аналогично несколько папок).


А нельзя случаем просто брать дату из первого файла ее в переменную, потом в цикле пройтись по всей папке и по дате файлы не удаляемые перенести допустим временно в папку. А в оставшихся вычленить самый новый и предыдущий от него, остальные грохнуть и потом вернуть первые? Пытался сам состряпать по такому принципу но застрял на вычленении чистой даты без времени.
0
16.02.2014, 23:01
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.02.2014, 23:01

Самые просматриваемые, самые залайканные, самые комментируемые посты вывести на отдельные страницы
Здравствуйте. Помогите пожалуйста, еще новичок в WordPress. Хочу сделать...

В начале учебного года в класс поступили два новых ученика. Как получить аналогичный массив, учитывающий рост новых учеников
Добрый вечер. Подскажите, как решить задачку. Условие. Данные о росте 25...

Вывести список пяти самых часто встречающихся расширений в указанной папке
Очень нужна помощь вот по какому вопросу: как найти и вывести список пяти...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru