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

artbiokron@vk 14-03-2020 17:08 2913167

Создание папки из части имени файла и перемещение в нее файлов содержащих эту часть
 
Прощу помощи, в программировании не буб-бум...

Проблема есть папка с тысячами фотографиями изделий в нескольких ракурсах, название фалов содержат пятизначный код изделия и ракурс (пример 02586.jpg 02586-2.jpg 02586_up.jpg 02586_d.jpg и т.д.) Необходимо создать папку из первых 5 цифр (код) и переместить туда все фото содержащие этот код.

Iska 14-03-2020 17:41 2913171

artbiokron@vk, код всегда пятизначный, состоит только из цифр и всегда находится в начале имени файла? Все файлы в одном каталоге, или есть и вложенные подкаталоги? Все файлы имеют расширение «.jpg»?

Если всё так — пробуйте:
Скрытый текст
Код:

@echo off
setlocal enableextensions enabledelayedexpansion

set sSourceFolder=C:\Мои проекты\0305

pushd "%sSourceFolder%" && (
        for /f "usebackq delims=" %%i in (`2^>nul dir /b /a:-d "*.jpg" ^| findstr.exe /r /b /e /c:"[0-9][0-9][0-9][0-9][0-9].*[.]jpg"`) do (
                set sVar=%%~ni
                set sNewFolderName=!sVar:~0,5!
                if not exist "!sNewFolderName!\." md "!sNewFolderName!"
                >nul move "%%~i" "!sNewFolderName!\%%~i"
        )
        popd
) || (
        echo Can't find source folder [%sSourceFolder%].
        exit /b 1
)

endlocal
exit /b 0


artbiokron@vk 14-03-2020 18:01 2913178

Благодарю.
да, код всегда пятизначный, всегда в начале имени, все в одном каталоге, все файлы имеют расширение «.jpg»

megaloman 14-03-2020 22:51 2913187

Цитата:

Цитата artbiokron@vk
код всегда пятизначный, всегда в начале имени, все в одном каталоге, все файлы имеют расширение «.jpg» »

То же, что у Iska, но без setlocal enableextensions enabledelayedexpansion и немного изменил регулярку
Код:

@Echo Off
cls
        Set "BoxIn=Z:\Box_In"
        Set "BoxOut=Z:\Box_Out"
        Set "Ext=jpg"
        Set "RMask=^[0-9][0-9][0-9][0-9][0-9].*\.%Ext%$"
        Set /A N=5

        Pushd "%BoxIn%" ||(Echo Folder "%BoxIn%" not found &Pause &Exit /b 2)
        FOR /F "usebackq delims=" %%f IN (`2^>nul Dir /B /A:-D "*.%Ext%" ^|FINDSTR /I /X /R /C:"%RMask%"`) DO (
                Set "Name=%%f"
                2>nul Call MD "%BoxOut%\%%Name:~0,%N%%%"
                Call Move /Y "%%f" "%BoxOut%\%%Name:~0,%N%%%\" >nul
        )
        Popd
Pause
Exit /B 0


DJ Mogarych 14-03-2020 23:36 2913191

Цитата:

Цитата megaloman
^[0-9][0-9][0-9][0-9][0-9] »

Код:

^\d{5}

megaloman 15-03-2020 00:13 2913193

DJ Mogarych,
Цитата:

Цитата DJ Mogarych
^\d{5} »

Похоже эта конструкция в findstr не работает, ни \d ни {5}

DJ Mogarych 15-03-2020 07:33 2913204

Странная реализация регулярных выражений, в таком случае.

Iska 15-03-2020 11:43 2913219

DJ Mogarych, не то слово ;).

artbiokron@vk 15-03-2020 12:47 2913229

Решил вопрос следующим:
Код:

Set "BoxIn=C:\00_TEMP_LR\_2400"
Set "Mask=P_*.jpg"
Set /A NN=5

Set "BoxOut=C:\00_TEMP_LR\_2400"

FOR /F "usebackq tokens=1,2 delims=_" %%i IN (`2^>nul Dir "%BoxIn%\%Mask%" /B /A:-D`) DO Call :MoveNN "%%i" "%%j" "%BoxIn%" "%BoxOut%" %NN%
GoTo :Eof

:MoveNN
        If Not Exist "%~3\%~1_%~2" GoTo :Eof
        Set "NewDir=%~2"
        Call Set "NewDir1=%%NewDir:~0,%5%%"
        Set "NewDir=%~4\%NewDir1%"
        If Not Exist "%NewDir%" Md "%NewDir%" >nul 2>&1
        Move "%~3\%~1_%NewDir1%*%~x2" "%NewDir%\" >nul 2>&1
GoTo :Eof

пришлось переименовать файлы, чтобы они не содержали "_" и добавив префикс "P-"

megaloman 15-03-2020 13:49 2913242

artbiokron@vk, Как-то Вы на лету успеваете постановку изменить.
Цитата:

Цитата artbiokron@vk
пришлось переименовать файлы, чтобы они не содержали "_" и добавив префикс "P-" »

Расшифруйте, какой был файл, как Вы его переименовали, в какую папку переместили (какая-то путаница у Вас с символами "_" и "-")
Вот вариант с префиксом и групповым переносом файлов (будет работать быстрее).
Код:

@Echo Off
cls
        Set  "BoxIn=Z:\Soft_In"
        Set "BoxOut=Z:\Soft_In"

        Set "Prefix=P_"
        Set "Ext=jpg"

        Set "RMask=^%Prefix%[0-9][0-9][0-9][0-9][0-9].*\.%Ext%$"
rem        Set "RMask=^%Prefix%......*\.%Ext%$"
        Set "N=2,5"

        Pushd "%BoxIn%" ||(Echo Folder "%BoxIn%" not found &Pause &Exit /b 2)
        FOR /F "usebackq delims=" %%f IN (`2^>nul Dir /B /A:-D "%Prefix%*.%Ext%" ^|FINDSTR /I /X /R /C:"%RMask%"`) DO (
                If Exist "%%f" (
                        Set "Name=%%~nf"
                        2>nul Call MD "%BoxOut%\%Prefix%%%Name:~%N%%%"
                        >nul Call Move /Y "%Prefix%%%Name:~%N%%%*%%~xf" "%BoxOut%\%Prefix%%%Name:~%N%%%\"
                )
        )
        Popd
Pause
Exit /B 0

Здесь оставлен контроль кода на наличие всех цыфирей. Если в коде всё что угодно - раскомментируйте красную строку

artbiokron@vk 17-03-2020 10:32 2913520

Благодарю за ответы, дело в том что в описании я указал что есть файлы в которых после пятизначного кода через "-" (минус) идет цифровой индекс и есть ракурсы которые записаны буквами через нижнее подчеркивание "_". Я программировании не бум-бум =)) поэтому и описал что мне помог вот этот код, я нашел его тут на просторах форума и подогнал навзания своих файлов чтобы он работал =)))
Цитата:

Решил вопрос следующим:
Код:Выделить весь код
Set "BoxIn=C:\00_TEMP_LR\_2400"
Set "Mask=P_*.jpg"
Set /A NN=5

Set "BoxOut=C:\00_TEMP_LR\_2400"

FOR /F "usebackq tokens=1,2 delims=_" %%i IN (`2^>nul Dir "%BoxIn%\%Mask%" /B /A:-D`) DO Call :MoveNN "%%i" "%%j" "%BoxIn%" "%BoxOut%" %NN%
GoTo :Eof

:MoveNN
If Not Exist "%~3\%~1_%~2" GoTo :Eof
Set "NewDir=%~2"
Call Set "NewDir1=%%NewDir:~0,%5%%"
Set "NewDir=%~4\%NewDir1%"
If Not Exist "%NewDir%" Md "%NewDir%" >nul 2>&1
Move "%~3\%~1_%NewDir1%*%~x2" "%NewDir%\" >nul 2>&1
GoTo :Eof
пришлось переименовать файлы, чтобы они не содержали "_" и добавив префикс "P-"


Время: 18:34.

Время: 18:34.
© OSzone.net 2001-