Компьютерный форум 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=347945)

NuclearBox 10-02-2021 22:03 2949632

Перемещение файлов в папки, названные по части имен файлов
 
Здравствуйте.
Помогите написать батник для перемещения файлов в папки, которым присваивается имя, соответствующее первым 10 символам имен файлов.

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

Iska 10-02-2021 22:57 2949643

Код:

@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 2949656

Iska, спасибо! С фильтром через регулярные выражения работает отлично.

alpap 11-02-2021 01:16 2949657

Код:

@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 2949677

Можно соединить идею 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 2949942

alpap, megaloman, спасибо за интересные варианты!


Время: 13:02.

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