[CMD] Поиск и перемещение файлов с датой в имени.

askot

Новый пользователь
Сообщения
7
Симпатии
0
Баллы
11
#1
Здравствуйте!

Помогите, пожалуйста, написать батник для поиска и перемещения файлов с датой в имени. Суть такова:
1. Имеется папка с исходными файлами (допустим "Source").
2. В папке находятся три типа файлов:
- yyyymmdd***********.jpg
- yyyymmdd***********.xml
- yyyymmdd***********_o1.jpg
Из имени файлов понятно что первые восемь символов это дата.
3. Необходимо сравнить дату в имени файла с текущей датой.
4. Если дата в имени не совпадает с текущей датой, то переместить файл в созданную папку
"Old_files".
5. Если дата в имени совпадает с текущей, то оставить файл в текущей папке.
6. Пункты 3-5 применить ко всем файлам, находящимся в папке "Source".

Как решить данную задачку? Заранее благодарен!
 

Dragokas

Very kind Developer
Команда форума
Супер-Модератор
Разработчик
Клуб переводчиков
Сообщения
5,963
Симпатии
5,786
Баллы
588
#2
Здравствуйте, askot !

Добро пожаловать на SafeZone !

CMD/BATCH:
for /f "delims=" %%a in ('dir /b /a-d "Source\*" ^| findstr /RVC:"^%date:~-4%%date:~3,2%%date:~,2%"') do move /y "Source\%%a" "Old_files\"
 

askot

Новый пользователь
Сообщения
7
Симпатии
0
Баллы
11
#3

askot

Новый пользователь
Сообщения
7
Симпатии
0
Баллы
11
#4
Здравствуйте!

Поиск и перемещение файлов с помощью приведенного Вами кода работает. Еще раз спасибо! Но возникла еще одна проблема. Попытаюсь объяснить.

К некоему объекту идет привязка всех трех файлов. В именах файлов, после первых восьми символов даты, присутствуют шесть символов указания времени. Выглядит это таким образом:

yyyymmddHHMMSS*****.jpg
yyyymmddHHMMSS*****.xml
yyyymmddHHMMSS*****_o1.jpg

где:

HH - часы
MM - минуты
SS - секунды

Иногда в исходную папку ("Source") работающая программа скидывает файл не связанный (по дате и времени в имени) ни с какими другими файлами. Как его найти среди всех файлов папки и переместить в папку "Old_files"? Это реально сделать?
 

Dragokas

Very kind Developer
Команда форума
Супер-Модератор
Разработчик
Клуб переводчиков
Сообщения
5,963
Симпатии
5,786
Баллы
588
#5
скидывает файл не связанный (по дате и времени в имени) ни с какими другими файлами.
Т.е. дата у него текущая, но он не связан с другими файлами?
Ну и как определить связан он или нет?
 

askot

Новый пользователь
Сообщения
7
Симпатии
0
Баллы
11
#6
Т.е. дата у него текущая, но он не связан с другими файлами?
Ну и как определить связан он или нет?
Да, дата текущая но время в имени не получается привязать ни к одному из всех файлов в папке.

Если провести своебразную аналогию, то получается так:
"Объект" = yyyymmddHHMMSS****.jpg + yyyymmddHHMMSS****.xml + yyyymmddHHMMSS****_o1.jpg

Тут же получается, что этот файл (по времени в имени) нельзя связать ни с каким другим файлом в папке, хотя дата в имени равна текущей дате. Такой файл может быть не один в папке :(.
Как определиь связан файл с другими или нет? Сравнивать все файлы по времени в имени?
 

Dragokas

Very kind Developer
Команда форума
Супер-Модератор
Разработчик
Клуб переводчиков
Сообщения
5,963
Симпатии
5,786
Баллы
588
#7
Если найдётся ещё хоть один файл, начинающийся с такой же Даты-Времени - будет ли это достаточным условием, чтобы признать его связанным с объектом?
 

askot

Новый пользователь
Сообщения
7
Симпатии
0
Баллы
11
#8
Строгое правило таково что объекту соответствует три файла (не более и не менее).

"Объект" = yyyymmddHHMMSS****.jpg + yyyymmddHHMMSS****.xml + yyyymmddHHMMSS****_o1.jpg

Все остальные файлы, находящиеся в папке, считаются некорректными и не подлежат последующей обработке.
А если поступить немного иначе? Искать в исходной папке связки из этих трёх файлов и оставлять их, а всё остальное откидывать в папку "Old_files".
 

Dragokas

Very kind Developer
Команда форума
Супер-Модератор
Разработчик
Клуб переводчиков
Сообщения
5,963
Симпатии
5,786
Баллы
588
#9
CMD/BATCH:
@echo off
SetLocal EnableExtensions

:: Источник
set "src=Source"

:: Целевая папка для старых файлов
set "dst=Old_files"

set "CurDate=%date:~-4%%date:~3,2%%date:~,2%"

for /f "delims=" %%a in ('dir /b /a-d "%src%\*" ^| findstr /RVC:"^%CurDate%"') do move /y "Source\%%a" "%dst%\"
for /f "delims=" %%a in ('dir /b /a-d "%src%\*" ^| findstr /RC:"^%CurDate%"') do (

  call :CheckReq "%%a" || move /y "%src%\%%a" "%dst%\"
)
goto :eof

:CheckReq [file]
 
  :: -= Object -=
  :: yyyymmddHHMMSS*****.jpg
  :: yyyymmddHHMMSS*****.xml
  :: yyyymmddHHMMSS*****_o1.jpg
 
  set "dt=%~1"
  set "dt=%dt:~,14%"
  if exist "%src%\%dt%*.jpg" if exist "%src%\%dt%*.xml" if exist "%src%\%dt%*_o1.jpg" exit /b 0
exit /b 1
 

askot

Новый пользователь
Сообщения
7
Симпатии
0
Баллы
11
#10
Благодарю! Завтра буду смотреть что и как. Отпишусь.
 

askot

Новый пользователь
Сообщения
7
Симпатии
0
Баллы
11
#11
Извиняюсь за то что сразу не ответил. Огромное спасибо, Вы очень помогли мне.
 
Сверху Снизу