Войти

Показать полную графическую версию : [решено] Копирование фото из папки №2 в папку №1 на основании сравнения


Viberezh
10-12-2019, 15:11
Добрый день.
Нужна помощь в решении следующего вопроса:
Есть 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
@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
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
Viberezh, Поставьте четко задачу: у меня решается задача для файлов формата 1234_123_1.jpg
Объясните, сколько знаков (min-max) может содержаться в каждой части имени, сейчас это жестко 4-3-1.

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

megaloman
11-12-2019, 13:55
Вот вариант: во всех трёх частях число знаков произвольное. В выделенной строке закомментирована маска для фиксированного количества в 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
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
Настроил копирование в другую папку Set "Dest=Name", »Откуда копирование? Что в источнике: папка с кучей файлов или папка с подпапками? Или переименование надо сделать в вашей указанной папке
Set "Dest=Name",

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

megaloman
12-12-2019, 17:42
Viberezh, Почему 2 переименовываем именно в 9? +7 - это задаваемая величина, или её надо как-то определить?
Я правильно понимаю: есть некая папка заданная в %Dest%, внутри папки надо все файлы с номерами, кроме 1, переименовать в номера +7 ?
А если есть ряд файлов _2 _5 _8 с дырками в нумерации, их во что переименовывать, в _9 _12 _15 или в _9 _10 _11 ?
....................
....................
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
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
Viberezh, сделано

Viberezh
13-12-2019, 11:55
megaloman, спасибо!




© OSzone.net 2001-2012