Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] Копирование фото из папки №2 в папку №1 на основании сравнения (http://forum.oszone.net/showthread.php?t=343235)

Viberezh 10-12-2019 15:11 2899795

Копирование фото из папки №2 в папку №1 на основании сравнения
 
Добрый день.
Нужна помощь в решении следующего вопроса:
Есть 2 сетевых хранилища (далее №1 и №2) с изображениями.
Интересующие изображения имеют формат имени 1234_100_1.jpg (код_id_номер фото - код и id любые числа), причём в хранилище №1 они лежат все в одной папке, а в хранилище №2 в разных.
Необходимо сравнить оба хранилища по наличию jpg с одинаковыми именами, игнорируя файлы другого расширения и jpg с текстом в имени, например 111_название_1 или 111_222_1-2.
Если находится файл с одинаковым именем, например 228_145_1.jpg, то копируем из хранилища №2 все фото с этим кодом и id, то есть 228_145_2.jpg 228_145_3.jpg и тд в хранилище №1.

megaloman 10-12-2019 19:45 2899843

Код:

@Echo Off
        Set "Dir1=\\Server1\Test1"
        Set "Dir2=\\Server2\Test2"

        Set "Ext=jpg"
        Set "Mask=[0-9][0-9][0-9][0-9]_[0-9][0-9][0-9]_[0-9]"

        >"%Dir1%\%~nx0.tmp" (For /F "usebackq delims=" %%d In (`2^>nul Dir /B /S /A:D "%Dir2%\"`) Do (
                For /F "usebackq delims=" %%f In (`2^>nul Dir /B /A:-D "%%d\*.%Ext%" ^|FINDSTR /I /R /C:"^%Mask%\.%Ext%$"`) Do (Echo %%d\%%f)
        ))

        For /F "usebackq delims=" %%f In (`2^>nul Dir /B /A:-D "%Dir1%\*.%Ext%" ^|FINDSTR /I /R /C:"^%Mask%\.%Ext%$"`) Do (
                Call Set "Ffile=%%~nf"
                >nul 2>&1 FINDSTR /I /C:"\%%f" "%Dir1%\%~nx0.tmp" &&Call :MyCopy "\\%%Ffile:~0,-1%%[0-9]\.%Ext%$" "%Dir1%\%~nx0.tmp"
        )
        2>nul Del "%Dir1%\%~nx0.tmp"
Exit /B 0

:MyCopy
        For /F "usebackq delims=" %%g In (`2^>nul FINDSTR /I /R /C:%1 %2`) Do >nul Copy "%%g" "%~dp2"
Exit /B

Боюсь, при большом количестве файлов процесс займет значительное время

Viberezh 10-12-2019 22:48 2899866

megaloman, спасибо, завтра опробую.
Вопрос по маске Set "Mask=[0-9][0-9][0-9][0-9]_[0-9][0-9][0-9]_[0-9]", в именах может быть разное количество цифр в части кода и id вплоть до 6 символов, возможно как-то это задать в маску?
В текущем исполнении, если правильно понял, будут искаться файлы с четырьмя - тремя - и одним символами.

megaloman 10-12-2019 23:17 2899870

Viberezh, Поставьте четко задачу: у меня решается задача для файлов формата 1234_123_1.jpg
Объясните, сколько знаков (min-max) может содержаться в каждой части имени, сейчас это жестко 4-3-1.

Viberezh 11-12-2019 08:32 2899894

megaloman, в первой части от 4 до 6 знаков, во второй от 1 до 6 знаков.
P.S.
Возможно по результату выполнения вывести в текстовой документ имена скопированных файлов?

megaloman 11-12-2019 13:55 2899942

Вот вариант: во всех трёх частях число знаков произвольное. В выделенной строке закомментирована маска для фиксированного количества в 1 цифру в третей части. Если Вам надо так, уберите rem.
Чтобы не было недопонимания: берётся файл в первой папке и, если он имеется во второй папке, копируются в первую папку из второй все файлы с одинаковыми первой и второй частью имени.
Лог файл создаётся в первой папке под именем скрипта с расширением log
Код:

@Echo Off
        Set "Dir1=\\Server\Test1"
        Set "Dir2=\\Server\Test2"

        Set "Ext=jpg"

        Set "Mask=[0-9]*_[0-9]*_[0-9]*"
rem        Set "Mask=[0-9]*_[0-9]*_[0-9]"

        Set "Log=%Dir1%\%~nx0.log"

        >"%Dir1%\%~nx0.tmp1" (For /F "usebackq delims=" %%i In (`2^>nul Dir /B /A:-D "%Dir1%\*.%Ext%"  ^|FINDSTR /I /R /C:"^%Mask%\.%Ext%$"`) Do (Echo %%i))

        >"%Dir1%\%~nx0.tmp2" (For /F "usebackq delims=" %%d In (`2^>nul Dir /B /S /A:D "%Dir2%\"`) Do (
                For /F "usebackq delims=" %%i In (`2^>nul Dir /B /A:-D "%%d\*.%Ext%"  ^|FINDSTR /I /R /C:"^%Mask%\.%Ext%$"`) Do (Echo %%d\%%i)
        ))

        >"%Log%" Echo %Date% %Time%

        For /F "usebackq tokens=1,2,3* delims=_." %%i In (`2^>nul more "%Dir1%\%~nx0.tmp1"`) Do (
                >nul 2>nul FINDSTR /I /R /C:"\\%%i_%%j_%%k\.%%l$" "%Dir1%\%~nx0.tmp2" &&(
                        For /F "usebackq delims=" %%f In (`2^>nul more "%Dir1%\%~nx0.tmp2" ^|FINDSTR /I /R /C:"\\%%i_%%j_[0-9]*\.%%l$"`) Do (
                                If Not Exist "%Dir1%\%%~nxf" (>nul Copy "%%f" "%Dir1%\" &>>"%Log%" Echo %%f)
                        )
                )
        )
        >>"%Log%" Echo %Date% %Time%

        2>nul Del "%Dir1%\%~nx0.tmp1"
        2>nul Del "%Dir1%\%~nx0.tmp2"
Exit /B 0


Viberezh 12-12-2019 14:06 2900081

megaloman, дополнение к задаче:
Настроил копирование в другую папку Set "Dest=Name", нужно переименовать третью часть файлов после копирования по алгоритму: 1234_123_2.jpg = 1234_123_9.jpg; 1234_123_3.jpg = 1234_123_10.jpg и т.д. по возрастанию.
Возможно реализовать?
Заранее спасибо!
Скрытый текст

Код:

@Echo Off
        Set "Dir1=\\Server\Test1"
        Set "Dir2=\\Server\Test2"
        Set "Dest=Name"

        Set "Ext=jpg"

        Set "Mask=[0-9]*_[0-9]*_[0-9]*"
rem        Set "Mask=[0-9]*_[0-9]*_[0-9]"

        Set "Log=%Dir1%\%~nx0.log"

        >"%Dir1%\%~nx0.tmp1" (For /F "usebackq delims=" %%i In (`2^>nul Dir /B /A:-D "%Dir1%\*.%Ext%"  ^|FINDSTR /I /R /C:"^%Mask%\.%Ext%$"`) Do (Echo %%i))

        >"%Dir1%\%~nx0.tmp2" (For /F "usebackq delims=" %%d In (`2^>nul Dir /B /S /A:D "%Dir2%\"`) Do (
                For /F "usebackq delims=" %%i In (`2^>nul Dir /B /A:-D "%%d\*.%Ext%"  ^|FINDSTR /I /R /C:"^%Mask%\.%Ext%$"`) Do (Echo %%d\%%i)
        ))

        >"%Log%" Echo %Date% %Time%

        For /F "usebackq tokens=1,2,3* delims=_." %%i In (`2^>nul more "%Dir1%\%~nx0.tmp1"`) Do (
                >nul 2>nul FINDSTR /I /R /C:"\\%%i_%%j_%%k\.%%l$" "%Dir1%\%~nx0.tmp2" &&(
                        For /F "usebackq delims=" %%f In (`2^>nul more "%Dir1%\%~nx0.tmp2" ^|FINDSTR /I /R /C:"\\%%i_%%j_[0-9]*\.%%l$"`) Do (
                                If Not Exist "%Dir1%\%%~nxf" (>nul Copy "%%f" "%Dest%\" &>>"%Log%" Echo %%f)
                        )
                )
        )
        >>"%Log%" Echo %Date% %Time%

        2>nul Del "%Dir1%\%~nx0.tmp1"
        2>nul Del "%Dir1%\%~nx0.tmp2"
Exit /B 0


megaloman 12-12-2019 14:09 2900082

Цитата:

Цитата Viberezh
Настроил копирование в другую папку Set "Dest=Name", »

Откуда копирование? Что в источнике: папка с кучей файлов или папка с подпапками? Или переименование надо сделать в вашей указанной папке
Set "Dest=Name",

Viberezh 12-12-2019 14:21 2900083

megaloman, переименовать скопированные файлы по результату работы Вашего скрипта, только не в папку Set "Dir1=\\Server\Test1" как было изначально, а в мою отдельную папку "Set Dest=Name"

megaloman 12-12-2019 17:42 2900107

Viberezh, Почему 2 переименовываем именно в 9? +7 - это задаваемая величина, или её надо как-то определить?
Я правильно понимаю: есть некая папка заданная в %Dest%, внутри папки надо все файлы с номерами, кроме 1, переименовать в номера +7 ?
А если есть ряд файлов _2 _5 _8 с дырками в нумерации, их во что переименовывать, в _9 _12 _15 или в _9 _10 _11 ?
Если просто добавлять +7 к имени, то в дополнение к Вашему (моему изменённому) скрипту
Код:

....................
....................
        Set "Dest=Z:\Box_Out"
....................
....................
        2>nul Del "%Dir1%\%~nx0.tmp1"
        2>nul Del "%Dir1%\%~nx0.tmp2"

        Call :MyRen "%Dest%" "%Ext%" 7

Exit /B 0

:MyRen
        For /F "usebackq tokens=1,2,3* delims=_." %%i In (`2^>nul Dir /B /A:-D "%~1\*_*_*.%~2"`) Do (
                Set /A Num=10000000+%%k+%3
                If Not %%k==1 If %%k LSS 10000000 Call Ren "%~1\%%i_%%j_%%k.%~2" "%%i_%%j_%%Num%%.%~2"
        )
        For /F "usebackq tokens=1,2,3* delims=_." %%i In (`2^>nul Dir /B /A:-D "%~1\*_*_*.%~2"`) Do (
                Set /A Num=%%k-10000000
                If %%k GTR 10000000 Call Ren "%~1\%%i_%%j_%%k.%~2" "%%i_%%j_%%Num%%.%~2"
        )
Exit /B 0

Или отдельным скриптом
Код:

@Echo Off
        Set "Dest=Z:\Box_Out"
        Set "Ext=jpg"

        Call :MyRen "%Dest%" "%Ext%" 7
Exit /B 0

:MyRen
        For /F "usebackq tokens=1,2,3* delims=_." %%i In (`2^>nul Dir /B /A:-D "%~1\*_*_*.%~2"`) Do (
                Set /A Num=10000000+%%k+%3
                If Not %%k==1 If %%k LSS 10000000 Call Ren "%~1\%%i_%%j_%%k.%~2" "%%i_%%j_%%Num%%.%~2"
        )
        For /F "usebackq tokens=1,2,3* delims=_." %%i In (`2^>nul Dir /B /A:-D "%~1\*_*_*.%~2"`) Do (
                Set /A Num=%%k-10000000
                If %%k GTR 10000000 Call Ren "%~1\%%i_%%j_%%k.%~2" "%%i_%%j_%%Num%%.%~2"
        )
Exit /B 0


Viberezh 13-12-2019 09:13 2900174

megaloman, возьмём, к примеру, файл 1234_100_2.jpg, на нём изображен товар, последняя цифра, в нашем случае 2, это порядковый номер, то есть на фото 1234_100_2.jpg — 1234_100_8.jpg изображён товар в разных ракурсах, переименовать _2 в конце имени в 9 нужно для того, чтобы после заливки на сайт не перезаписывать уже имеющиеся ракурсы, для большинства товаров имеется до 9 ракурсов.
Дырок в нумерации быть не должно, но если вдруг окажется, то _2 _5 _8 станут _9 _12 _15.

megaloman 13-12-2019 10:18 2900184

Viberezh, сделано

Viberezh 13-12-2019 11:55 2900207

megaloman, спасибо!


Время: 05:03.

Время: 05:03.
© OSzone.net 2001-