Войти

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


surgutfred
31-10-2018, 14:00
Добрый день.
Есть 2 файлопомойки:
1 С кучей безсистемных папок и в них куча папок с множеством файлов *.usr созданные в разные года.
2 С некоторой системой типа \2018\09.2018\03.09.2018\CONS#64_896377#2018_09_03#13_14_57\CONS#64_896377.USR (жирным скажем так не нужная мне папка, и кроме целевых там еще есть "лишние файлы")
Много файлов с одинаковыми именами, но от разных дат
Хочу разложить по полочкам, т.е. смотрим дату создания файла *.usr, на полочке создаем 2016\08\23 и туда копируем все файлы созданные в эту дату.
Решил так (извините за топорность, я не волшебник, я только учусь):

rem Смотрит дату USR и копирует в архив в папку по дате
@Echo Off
del /q G:\BackUp\USR_Archive\log.txt
rem Каталог с помойкой USR
set katalog=Y:\USR\
rem Каталог куда ложим USR с разбивкой по периодам
set ArchPath=G:\BackUp\USR_Archive\USR_ALL\

rem Ищем в заданном каталоге и вложенных все файлы *.USR
rem обязательно параметр %%a в кавычках "%%a" иначе некорректно обработает пути с пробелами
For /r %katalog% %%a In (*.usr) Do @Call :Period "%%a" %%~ta

rem Теперь каталог с USR интернетчиков
set katalog=F:\USR_Archive\INET\
rem обязательно параметр %%a в кавычках "%%a" иначе некорректно обработает пути с пробелами
For /r %katalog% %%a In (*.usr) Do @Call :Period "%%a" %%~ta
GoTo :EOF

rem Определяем дату изменения файла usr, т.е. дату обновления
:Period
Set f_Nam=%1
Set f_Name=%f_Nam: =%
Set f_Dat=%2
Set f_Date=%f_Dat: =%
Set f_Day1=%f_Date:~0,2%
Set f_Day=%f_Day1: =%
Set f_Month1=%f_Date:~3,2%
Set f_Month=%f_Month1: =%
Set f_Year1=%f_Date:~6,4%
Set f_Year=%f_Year1: =%

rem Копируем USR в соответствующий период Архив\Год\Месяц
xcopy /y %f_Name% %ArchPath%\%f_Year%\%f_Month%\%f_Day%\ /d /f >> G:\BackUp\USR_Archive\log.txt
GoTo :EOF


Вроде все работает и копирует, но в конце вылетает с ошибкой xcopy, все файлы не успевает скопировать
Подозреваю что слишком длинные пути получаются.

Пробовал перевести на robocopy, но что то не срастается.

rem Смотрит дату USR и копирует в архив в папку по дате
@Echo Off
del /q G:\BackUp\USR_Archive\log.txt
rem Теперь каталог с USR интернетчиков
set katalog=C:\FTP\1
rem Каталог куда ложим USR с разбивкой по периодам
set ArchPath=C:\FTP\2

rem обязательно параметр %%a в кавычках "%%a" иначе некорректно обработает пути с пробелами
For /r %katalog% %%a In (*.usr) Do @Call :Period "%%~nxa" "%%~dpa" %%~ta
GoTo :EOF

rem Определям дату измеения файла usr, т.е. дату обновления
:Period
Set f_Put=%~2
Set f_Nam=%~1
Set f_Name=%f_Nam: =%
Set f_Dat=%3
Set f_Date=%f_Dat: =%
Set f_Day1=%f_Date:~0,2%
Set f_Day=%f_Day1: =%
Set f_Month1=%f_Date:~3,2%
Set f_Month=%f_Month1: =%
Set f_Year1=%f_Date:~6,4%
Set f_Year=%f_Year1: =%

rem Копируем USR в соотвествующий период Архив\Год\Месяц
robocopy %f_Put% %ArchPath%\%f_Year%\%f_Month%\%f_Day% %f_Name% >> C:\FTP\log.txt
GoTo :EOF


Если так то копирует как надо, но только если в пути нет пробела
-------------------------------------------------------------------------------
ROBOCOPY :: Robust File Copy for Windows
-------------------------------------------------------------------------------

Начало: 31 октября 2018 г. 15:31:55
Источник : C:\FTP\1\3\
Назначение : C:\FTP\2\2016\02\01\

Файлы: CONS#1_005650.USR

Параметры: /DCOPY:DA /COPY:DAT /R:1000000 /W:30

------------------------------------------------------------------------------
, если только папка с пробелом, не копирует. Например папка АТ СИНИТИ
ROBOCOPY :: Robust File Copy for Windows
-------------------------------------------------------------------------------

Начало: 31 октября 2018 г. 15:31:55
Источник - C:\FTP\1\АТ\
Назначение - C:\FTP\Синити\

Файлы:
Параметры: /DCOPY:DA /COPY:DAT /R:1000000 /W:30

------------------------------------------------------------------------------

ОШИБКА: Недопустимый параметр #3 : "C:\FTP\2\2015\08\18"

Как допилить ? Или альтернативный вариант предложите

alpap
31-10-2018, 16:59
surgutfred,
странно, вы же сами в коде пишете:
rem обязательно параметр %%a в кавычках "%%a" иначе некорректно обработает пути с пробелами »
и тем не менее в xcopy или в robocopy переменные путей в парные кавычки не берете, на свои же грабли наступаете?

megaloman
31-10-2018, 17:07
surgutfred, @Echo Off
Set "BoxIn=D:\Мой контент"
Set "BoxOut=Z:\Box_Out\Мой контент"

Set "Mask=*.bat"
rem Set "Mask=*.*"
rem Set "Mask=*.pdf *.fb2 *. *.epub"

For /F "usebackq delims=" %%d IN (`2^>nul Dir "%BoxIn%" /B /S /A:D`) DO (
Pushd "%%d" &&(
For /F "usebackq delims=" %%f IN (`2^>nul Dir "%Mask%" /B /A:-D`) DO (
Set "Nf=%%~tf"
Call :MySort "%%f" "%BoxOut%\%%Nf:~6,4%%\%%Nf:~3,2%%\%%Nf:~0,2%%"
)
Popd
)
)
GoTo :Eof

:MySort
If Not Exist %2 Md %2
Copy %1 "%~2\" >nul || Echo %1 %2
GoTo :EofЗамечание: копируем файлы по дате последнего изменения. Можно сделать и по дате создания, но придется привлечь wmic, что очень замедлит выполнение
Кроме того, я предполагал, что отображение даты в системе настроено на формат дд.мм.гггг, в противном случае надо код скорректировать

surgutfred
01-11-2018, 07:07
странно, вы же сами в коде пишете: »
Пробовал ставить в кавычки, либо вчера у меня мозги уже не работали, либо запутался в переменных, - у меня тогда не отрабатывало вообще. Не копировалось

megaloman, спасибо, в очередной раз выручаете.
На тестовых папках сработало на ура, загоню на помойки, посмотрим что выйдет.
Лишь бы опять команда не загнулась от нагрузки :(

Почему то на помойках не срабатывает, поменял только пути к папкам. Висит черное окно, и ничего не происходит в конечных папках ничего не появляется.
Думал может проблема в том что в имени некоторых папок есть расширение
(F:\USR_Archive\INET\2018\09.2018\03.09.2018\CONS#1_044770#2018_08_31#23_38_37.usr\CONS#1_044770.USR )
но скопировав в тестовые папки убедился что работает и с ними.

Осталось предположить что у меня слишком большой объем папок с файлами. Он что сначала весь массив считывает перед копированием?


Похоже что так, через некоторое время в итоговой папке стали таки появляться результаты. Фух :)

Amunrah
01-11-2018, 13:13
По-моему все это можно несколько проще записать...

@echo off

set "src=source_dir"
set "dest=destination_dir"

if not exist "%dest%\." md "%dest%"

for /f "delims=" %%f in ('dir "%src%\*.*" /b /s /a:-d') do (
for /f "tokens=1,2,3 delims=. " %%a in ("%%~tf") do (
xcopy "%%f" "%dest%\%%c\%%b\%%a\" /ifchy>>"%dest%\log.txt"
)
)

puhoj
11-03-2024, 11:45
По-моему все это можно несколько проще записать... »
всё работает, только как сделать так, чтобы файлы перемещались, а не копировались

DJ Mogarych
12-03-2024, 04:18
Вставить команду удаления исходного файла.

megaloman
12-03-2024, 16:22
@Echo Off &Cls
>nul Chcp 1251
Set "BoxIn=Z:\Box_In"
Set "BoxOut=Z:\Box_Out"
Set Mask="*.*"
Set "Log=Z:\Box_Out\log.txt"

Pushd "%BoxIn%" || (Echo Folder "%BoxIn%\" not found &Pause &Exit /B 2)
For /F "usebackq delims=" %%f In (`2^>nul Dir %Mask% /S /B /A:-D /O:D`) Do For /F "tokens=1,2,3 delims=. " %%i In ("%%~tf") Do (
If Not Exist "%BoxOut%\%%k.%%j.%%i" Md "%BoxOut%\%%k.%%j.%%i"
>nul Move "%%f" "%BoxOut%\%%k.%%j.%%i\"&&>>"%Log%" Echo "%BoxOut%\%%k.%%j.%%i\" ^<--- "%%f"
)
Popd
Pause
Exit /B 0
По дате изменения




© OSzone.net 2001-2012