PDA

Показать полную графическую версию : [решено] Перемещение файлов в папки, названные по части имен файлов


NuclearBox
10-02-2021, 22:03
Здравствуйте.
Помогите написать батник для перемещения файлов в папки, которым присваивается имя, соответствующее первым 10 символам имен файлов.

В директории масса файлов, имя которых начинается с дат в одинаковом формате вида 2021-01-01-??????????.???
Необходим батник, который будет создавать папки, имена которых соответствуют первым 10 символам имен файлов (как 2021-01-01), и перемещать в эти папки соответствующие файлы.

Iska
10-02-2021, 22:57
@echo off
setlocal enableextensions enabledelayedexpansion

for /f "usebackq delims=" %%i in (
`2^>nul dir /b /a:-d "*.*" ^| findstr.exe /r /c:"^[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]-.*\..*$"`
) do (
set sName=%%~nxi
set sDate=!sName:~0,10!
2>nul md "!sDate!"
>nul move "%%~fi" ".\!sDate!\"
)

endlocal
exit /b 0

NuclearBox
11-02-2021, 01:07
Iska, спасибо! С фильтром через регулярные выражения работает отлично.

alpap
11-02-2021, 01:16
@echo off
for /f "tokens=1-3* delims=-" %%a in ('dir /a-d/b "????-??-??-*"') do (
if not exist "%%a-%%b-%%c" md "%%a-%%b-%%c"
>nul move "%%a-%%b-%%c-%%d" "%%a-%%b-%%c"
)
pause

megaloman
11-02-2021, 08:56
Можно соединить идею Iska и alpap, а в Move написать перемещение не по файлу, а группой за дату (ИМХО, сработает быстрее)@Echo Off
cls
Set "BoxIn=Z:\Box_In"
For /f "usebackq tokens=1-3* delims=-" %%i In (
`2^>nul Dir /A:-D /B "%BoxIn%\????-??-??-*.*"^| findstr.exe /B /R /C:"^[0-9][0-9][0-9][0-9]-[0-1][0-9]-[0-3][0-9]-"`) Do (
If Exist "%BoxIn%\%%i-%%j-%%k-%%l" (
2>nul Md "%BoxIn%\%%i-%%j-%%k"
>NUL Move /Y "%BoxIn%\%%i-%%j-%%k-*.*" "%BoxIn%\%%i-%%j-%%k\"
)
)
Pause
Exit /B 0
Хотя, ИМХО, от findstr (выделено красным) можно и вовсе отказаться с незначительным ухудшением контроля имен, но с меньшим временем выполнения, хотя всё это для разовой задачи несущественно, раз она решена.

NuclearBox
13-02-2021, 16:26
alpap, megaloman, спасибо за интересные варианты!




© OSzone.net 2001-2012