Форум программистов, компьютерный форум, киберфорум
Наши страницы
Batch (CMD/BAT)
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.67/6: Рейтинг темы: голосов - 6, средняя оценка - 4.67
dokxpi
5 / 5 / 0
Регистрация: 18.08.2013
Сообщений: 58
1

Сравнение на сходство .JPG +.NEF файлов

20.04.2015, 21:08. Просмотров 1093. Ответов 18
Метки нет (Все метки)

Здравствуйте,
ребята, с меня большая банка пива

Фото архив (снимаю .JPG +.NEF) имеет следующую внутреннюю структуру,
–––––––––––––––––––––––––
../2010.06.07-30 [событие]
Edited
Print
Remote
Source
–––––––––––––––––––––––––
где,
• ../2010.06.07-30 [событие] — корневой каталог, кроме подкаталогов, в каталоге хранятся исходники .JPG
• Edited — отредактированные файлы из RAW ( NEF), файлы хранятся в формате .JPG
• Print — файлы редактируется на месте, внутри папки файлы хранятся в формате .JPG и .NEF
• Remote — удаленные файлы .NEF
• Source — исходники .NEF

Что нужно сделать?
1 действие bat файла
..ищет в папке Source файлы .NEF на сходство с .JPG, хранящиеся в папке Print и найденные файлы .NEF переносит в папку Print

2 действие (выполняется, после выполнение первого)
..сравнивает файлы JPG лежащие в корневом каталоге и лежащие в подкаталоге Edited на сходство с папкой Source и не найденные перемещаются в Remote. Условие: в случаи когда в корневом каталоге JPG–ка нет, а в папке Edited он присутствует, исходники .NEF (Source) не перемещается в папку Remote, но когда JPG присутствует в корневом каталоге и в подкаталоге Edited одновременно, то JPG, удаляются из корневого каталога (.NEF остаётся не тронутым)

Примечание к 2 действию:
папка Print, не участвует в сравнении на сходство

Примечание к 1 и 2 действию:
папка Remote выступает в качестве склада неудачных снимков и не должна участвовать в сравнении на сходство.

Добавлено через 21 час 30 минут
Под сравнением на сходство, подразумевается сравнение между именами файлов(не более), например:
DSC_2521.NEF
DSC_2521.JPG

С меня подарок, за подробностями в личку
0
Лучшие ответы (1)
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.04.2015, 21:08
Ответы с готовыми решениями:

Диалог выбора файлов, добавить тип выбираемых файлов jpg
здравствуйте, есть код: Sub Диалог_выбора_файлов() Dim oFD As FileDialog 'Объект...

Масштабирование JPG файлов
Существует ли простой способ уменьшить размер выводимого в HTML JPG-изображения, не нарушая его...

Множественное переименование jpg файлов
Добрый вечер, как переименовать jpg файлы? Пример мне надо чтобы из 11 вышло 60011, и таких...

Ошибка открытия .jpg файлов
Имеется установленная библиотека Qt 4.8.6 для vs2010, установленный qt-vs-addin-1.1.11, работа и...

Обработка jpg/png файлов
Приветствую. Есть куча графических файлов. Подскажите, можно ли как то без отображения файлов в...

18
Dragokas
Эксперт WindowsАвтор FAQ
17100 / 7155 / 861
Регистрация: 25.12.2011
Сообщений: 10,954
Записей в блоге: 16
21.04.2015, 11:38 2
Напишите примерное кол-во файлов JPG/NEF в папках Source и Print.

Не совсем понял. Структура каталогов примерно такая:
Вариант 1:
c:\2010.06.07-30 [событие]
c:\2010.06.07-30 [событие]\Edited
c:\2010.06.07-30 [событие]\Print
c:\2010.06.07-30 [событие]\Remote
c:\2010.06.07-30 [событие]\Source

Или такая:
Вариант 2:
c:\2010.06.07-30 [событие]
c:\kat\Edited
c:\kat\Print
c:\kat\Remote
c:\kat\Source

Цитата Сообщение от dokxpi Посмотреть сообщение
..сравнивает файлы JPG лежащие в корневом каталоге и лежащие в подкаталоге Edited на сходство с папкой Source и не найденные перемещаются в Remote.
Т.е. если какого-то из файлов нет в папке Source, перемещаем его в Remote, так?
Цитата Сообщение от dokxpi Посмотреть сообщение
исходники .NEF (Source) не перемещается в папку Remote
Противоречит предыдущему предложению (или является лишним), т.к. в нем не было речи о переносе файлов .NEF.
Как я понял здесь 3 отдельных действия:
1) Root\*.JPG <-> Source.NEF. При несовпадении перенос JPG -> Remote
2) Edited\*.JPG <-> Source.NEF. При несовпадении перенос JPG -> Remote
3) Root\*.JPG <-> Edited\*.JPG. При совпадении - удаление JPG из Root\
1
dokxpi
5 / 5 / 0
Регистрация: 18.08.2013
Сообщений: 58
21.04.2015, 21:07  [ТС] 3
Dragokas, заранее вас благодарю

Попробую сформулировать более четче, касательно структуры
Сравнение на сходство .JPG +.NEF файлов


Теперь упростим алгоритм, да бы не возникало противоречий (если будут замечания, рад буду выслушать)
1.) Print\*.JPG <-> Source.NEF. При совпадении перенос .NEF -> Print
2.) Edited\*.JPG <-> Source.NEF. При совпадении перенос .NEF-> Edited
3.) Root\*.JPG <-> Source.NEF. При несовпадении перенос .NEF -> Remote
0
Dragokas
Эксперт WindowsАвтор FAQ
17100 / 7155 / 861
Регистрация: 25.12.2011
Сообщений: 10,954
Записей в блоге: 16
22.04.2015, 08:57 4
Батник будете ложить в корневую папку или указывать вручную путь к корневому каталогу?
0
22.04.2015, 08:57
dokxpi
5 / 5 / 0
Регистрация: 18.08.2013
Сообщений: 58
22.04.2015, 11:50  [ТС] 5
Цитата Сообщение от Dragokas Посмотреть сообщение
Батник будете ложить в корневую папку или указывать вручную путь к корневому каталогу?
Батник буду ложить в корневую папку
0
ComSpec
3415 / 1959 / 628
Регистрация: 26.02.2014
Сообщений: 1,457
22.04.2015, 23:27 6
Цитата Сообщение от dokxpi Посмотреть сообщение
Попробую сформулировать более четче, касательно структуры
Теперь упростим алгоритм, да бы не возникало противоречий (если будут замечания, рад буду выслушать)
1.) Print\*.JPG <-> Source.NEF. При совпадении перенос .NEF -> Print
2.) Edited\*.JPG <-> Source.NEF. При совпадении перенос .NEF-> Edited
3.) Root\*.JPG <-> Source.NEF. При несовпадении перенос .NEF -> Remote
Цитата Сообщение от dokxpi Посмотреть сообщение
Батник буду ложить в корневую папку

Windows Batch file
1
2
3
4
5
6
7
8
9
10
11
12
@echo off
 
for %%i in ("Print" "Edited" ".") do (
 >.tmp (for /f "delims=" %%j in ('2^>nul dir/a-d/b "%%~i\*.JPG"') do @echo %%~nj.NEF)
 if %%i neq "." (set x=x& set y=%%i) else (set x=vx& set y="Remote")
 for /f "delims=" %%j in ('2^>nul dir/a-d/b "Source\*.NEF"^| cmd/v/c findstr/il!x!g:.tmp') do (
  cmd/v/c move/y "Source\%%j" !y!
 )
)
del .tmp
 
exit/b 0
2
dokxpi
5 / 5 / 0
Регистрация: 18.08.2013
Сообщений: 58
23.04.2015, 00:31  [ТС] 7
Цитата Сообщение от ComSpec Посмотреть сообщение
Код Windows Batch file
Не работает.
Не выполняет не одно из условий
Добавлено через 1 минут
Черный экран и когда пытаюсь закрыть окно, в ответ получаю вот такое содержимое.
Сравнение на сходство .JPG +.NEF файлов

Ах да, служебный .tmp файл успешно создан

del .tmp <- это тоже не работает
0
ComSpec
3415 / 1959 / 628
Регистрация: 26.02.2014
Сообщений: 1,457
23.04.2015, 02:03 8
dokxpi, поскольку я маг и ясновидящий, то я Вам настоятельно предлагаю переименовать Ваш "findstr.bat" или "cmd.bat", например, в "Сравнение и перемещение.bat", и будет Вам счастье.

Нельзя называть пакетные файлы именами, совпадающими с какими-либо командами!
2
dokxpi
5 / 5 / 0
Регистрация: 18.08.2013
Сообщений: 58
23.04.2015, 03:06  [ТС] 9
Красота, заработало!
Цитата Сообщение от ComSpec Посмотреть сообщение
поскольку я маг и ясновидящий
Точно!

А можно добавить ещё одно условие? Плиз.
Source.NEF -> Root\*.NEF. При совпадении перенос .NEF -> Source
0
ComSpec
3415 / 1959 / 628
Регистрация: 26.02.2014
Сообщений: 1,457
23.04.2015, 04:40 10
Цитата Сообщение от dokxpi Посмотреть сообщение
Source.NEF -> Root\*.NEF. При совпадении перенос .NEF -> Source




dokxpi, это возможно сделать только с переименованием перемещаемого файла, поскольку файлы с одинаковыми именами и расширениями в одной папке вместе не "уживутся": перемещаемый файл заменит существующий.



Вот код для сравнения, перемещения и переименования (к имени файла добавляется "[2]"):


Windows Batch file
1
2
3
4
5
6
7
8
9
@echo off
 
>.tmp (for /f "delims=" %%i in ('2^>nul dir/a-d/b "Source\*.NEF"') do @echo %%i)
for /f "delims=" %%i in ('2^>nul dir/a-d/b "*.NEF"^| findstr/ilxg:.tmp') do (
 move/y "%%i" "Source\%%~ni[2]%%~xi"
)
del .tmp
 
exit/b 0

.



Объединить оба кода можно так:


Windows Batch file
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
@echo off
 
for %%i in ("Print" "Edited" ".") do (
 >.tmp (for /f "delims=" %%j in ('2^>nul dir/a-d/b "%%~i\*.JPG"') do @echo %%~nj.NEF)
 if %%i neq "." (set x=x& set y=%%i) else (set x=vx& set y="Remote")
 for /f "delims=" %%j in ('2^>nul dir/a-d/b "Source\*.NEF"^| cmd/v/c findstr/il!x!g:.tmp') do (
  cmd/v/c move/y "Source\%%j" !y!
 )
)
>.tmp (for /f "delims=" %%i in ('2^>nul dir/a-d/b "Source\*.NEF"') do @echo %%i)
for /f "delims=" %%i in ('2^>nul dir/a-d/b "*.NEF"^| findstr/ilxg:.tmp') do (
 move/y "%%i" "Source\%%~ni[2]%%~xi"
)
del .tmp
 
exit/b 0

.
2
dokxpi
5 / 5 / 0
Регистрация: 18.08.2013
Сообщений: 58
23.04.2015, 05:51  [ТС] 11
Неправильно сформулировал условие, вот так:
4.) Все файлы .NEF из Root\ -> Перемещать в -> Source — в данном условии нет сравнения, просто перемещать .NEF из Root\ в папку Source

Добавлено через 7 минут
Цитата Сообщение от ComSpec Посмотреть сообщение
dokxpi, это возможно сделать только с переименованием перемещаемого файла, поскольку файлы с одинаковыми именами и расширениями в одной папке вместе не "уживутся": перемещаемый файл заменит существующий.
Добавлено через 8 минут
Одинаковых имен не будет, это просто шаг назад
Например:
1. перетащил 1.JPG в Print
2. запускаем bat. и скрипт тянет 1.NEF в папку Print

Шаг назад (если надо), перетягиваю эти два файла в Root\

А команда
4.) Файлы .NEF из Root\ -> Перемещать в -> Source
возвращает всё в исходную позицию

Добавлено через 15 минут
Цитата Сообщение от dokxpi Посмотреть сообщение
с переименованием перемещаемого файла
Не обязательно,
но было бы здорово вместо этого, выводить сообщение примерно следующего характера
Эй, вы уверены что хотите перезаписать такой то файл? (страховка)

*********************
В итоге у нас выполняется три из заданных трех условий. (Низкий Вам поклон)

Bash
1
2
3
4
5
6
7
8
9
10
11
12
@echo off
 
for %%i in ("Print" "Edited" ".") do (
 >.tmp (for /f "delims=" %%j in ('2^>nul dir/a-d/b "%%~i\*.JPG"') do @echo %%~nj.NEF)
 if %%i neq "." (set x=x& set y=%%i) else (set x=vx& set y="Remote")
 for /f "delims=" %%j in ('2^>nul dir/a-d/b "Source\*.NEF"^| cmd/v/c findstr/il!x!g:.tmp') do (
  cmd/v/c move/y "Source\%%j" !y!
 )
)
del .tmp
 
exit/b 0

Добавить сюда ещё четвертое условие
Все Файлы .NEF из Root\ -> Перемещать в -> Source и
по возможности (к этому условию) страховку от перезаписи

Эй, вы уверены что хотите перезаписать такой то файл? y/n — это упростило бы жизнь, например не нужно было бы в ручную сортировать .NEF и .JPG: скинул всё в Root/, а bat в свою очередь перетащил файлы .NEF в папку Source.
А так, без страховки, как то стремно, а дублировать, нет никакого желания

Было бы просто здорово!
0
Dragokas
Эксперт WindowsАвтор FAQ
17100 / 7155 / 861
Регистрация: 25.12.2011
Сообщений: 10,954
Записей в блоге: 16
23.04.2015, 11:26 12
Windows Batch file
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
@echo off
SetLocal EnableExtensions
cd /d "%~dp0"
 
:: -== struct ==-
:: this.bat
:: Edited\*.JPG
:: Remote\*.NEF
:: Source\*.NEF
:: Print\*.JPG
 
Set "Edited=Edited"
Set "Remote=Remote"
Set "Source=Source"
Set "Print=Print"
Set "Root=."
 
:: Compare method:
:: DSC_2521.NEF
:: DSC_2521.JPG
 
:: 1.) Print\*.JPG - Source.NEF. При совпадении перенос .NEF --^> Print
For /F "delims=" %%a in ('dir /b /a "%Print%\*.JPG" 2^>NUL') do if exist "%Source%\%%~na.NEF" move /y "%Source%\%%~na.NEF" "%Print%\"
 
:: 2.) Edited\*.JPG - Source.NEF. При совпадении перенос .NEF--^> Edited
For /F "delims=" %%a in ('dir /b /a "%Edited%\*.JPG" 2^>NUL') do if exist "%Source%\%%~na.NEF" move /y "%Source%\%%~na.NEF" "%Edited%\"
 
:: 3.) Source\*.NEF - .\*.JPG. При несовпадении перенос .NEF--^> Remote
For /F "delims=" %%a in ('dir /b /a "%Source%\*.NEF" 2^>NUL') do if not exist "%Root%\%%~na.JPG" move /y "%Source%\%%~na.NEF" "%Remote%\"
 
:: 3a) Source\*.NEF - Root\*.NEF. При совпадении перенос .NEF--^> Source (с подтверждением)
For /F "delims=" %%a in ('dir /b /a "%Source%\*.NEF" 2^>NUL') do if exist "%Root%\%%~na.NEF" move "%Root%\%%~na.NEF" "%Source%\"
 
:: 4.) Все файлы .NEF из Root\ -^> Перемещать в -^> Source
if exist "%Root%\*.NEF" move /y "%Root%\*.NEF" "%Source%\"
 
pause
Спасибо за подарочек)
2
dokxpi
5 / 5 / 0
Регистрация: 18.08.2013
Сообщений: 58
23.04.2015, 14:02  [ТС] 13
Цитата Сообщение от Dragokas Посмотреть сообщение
Спасибо за подарочек)
Пью кофе и наслаждаюсь процессом!

Bash
1
:: 3a)
3a) Уведомляет (выводит на монитор путь), но только, когда файлы уже перезаписались.. ну и чёрт с ним
Переборщил Я тут с условиями (есть некое противоречие)

Если я уберу 31 и 32 строку всё ли будет работать без ошибок?
Если, да. Всё в ажуре
Bash
1
2
:: 3a) Source\*.NEF - Root\*.NEF. При совпадении перенос .NEF--^> Source (с подтверждением)
For /F "delims=" %%a in ('dir /b /a "%Source%\*.NEF" 2^>NUL') do if exist "%Root%\%%~na.NEF" move "%Root%\%%~na.NEF" "%Source%\"
0
Dragokas
Эксперт WindowsАвтор FAQ
17100 / 7155 / 861
Регистрация: 25.12.2011
Сообщений: 10,954
Записей в блоге: 16
23.04.2015, 15:03 14
Цитата Сообщение от dokxpi Посмотреть сообщение
Уведомляет (выводит на монитор путь), но только, когда файлы уже перезаписались
Должно выводить перед перезаписью.
Тест:
Сравнение на сходство .JPG +.NEF файлов


Цитата Сообщение от dokxpi Посмотреть сообщение
Если я уберу 31 и 32 строку всё ли будет работать без ошибок?
Как предпочтете.
0
dokxpi
5 / 5 / 0
Регистрация: 18.08.2013
Сообщений: 58
23.04.2015, 15:51  [ТС] 15
Цитата Сообщение от Dragokas Посмотреть сообщение
Должно выводить перед перезаписью.
Не выводит! (если это не сложно починить, был бы рад)

Хронология событий
В Root\ лежит три файла
1.JPG
2.JPG
3.JPG
..а в папке Source лежат их братья
1.NEF
2.NEF
3.NEF

Теперь содержимое Source,
1.NEF
2.NEF
3.NEF
..копирую в Root\ и запускаю bat
Ответ:
Сравнение на сходство .JPG +.NEF файлов


Добавлено через 26 минут
Чтобы сработало уведомление,
случаем, условие 3a) не должно выполняться последним?
0
Dragokas
Эксперт WindowsАвтор FAQ
17100 / 7155 / 861
Регистрация: 25.12.2011
Сообщений: 10,954
Записей в блоге: 16
23.04.2015, 20:12 16
Цитата Сообщение от dokxpi Посмотреть сообщение
Теперь содержимое Source,
1.NEF
2.NEF
3.NEF
..копирую в Root\ и запускаю bat
Верно.
А что должно было произойти? Какое из условий должно было в описанном случае сработать?

Цитата Сообщение от dokxpi Посмотреть сообщение
Не выводит! (если это не сложно починить, был бы рад)
Так может ничего и не перезаписывается?

Но на всякий случай вот, с надежной проверкой подтверждения операции:
Windows Batch file
1
2
3
4
::
:: 3a) Source\*.NEF - Root\*.NEF. При совпадении перенос .NEF--^> Source (с подтверждением)
For /F "delims=" %%a in ('dir /b /a "%Source%\*.NEF" 2^>NUL') do if exist "%Root%\%%~na.NEF" (set ch=& set /p "ch=Заменить %%~na.NEF ? (y/n): "& cmd /v:ON /c if /i "!ch!"=="y" exit /b 1 || move /y "%Root%\%%~na.NEF" "%Source%\")
::
Ну и конечно 4-е условие как-то не состыковуется с 3а,
т.к. 4-е говорит - перемести все NEF c заменой,
а 3а) перемести только если совпадает + подтверждение.
Тогда зачем вообще 3а...
1
dokxpi
5 / 5 / 0
Регистрация: 18.08.2013
Сообщений: 58
23.04.2015, 21:17  [ТС] 17
Цитата Сообщение от Dragokas Посмотреть сообщение
т.к. 4-е говорит - перемести все NEF c заменой,
Точно, (я писал о том что 3a) не нужен и потом, сам же забыл об этом)
.. подтверждение нужно добавить в четвертый пункт (страховка от перезаписи)
Пункт 3a) - удалить вовсе
И всё, больше не каких правок .)
0
Dragokas
Эксперт WindowsАвтор FAQ
17100 / 7155 / 861
Регистрация: 25.12.2011
Сообщений: 10,954
Записей в блоге: 16
23.04.2015, 21:28 18
Лучший ответ Сообщение было отмечено dokxpi как решение

Решение

Тогда просто вот так:

Windows Batch file
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
@echo off
SetLocal EnableExtensions
cd /d "%~dp0"
 
:: -== struct ==-
:: this.bat
:: Edited\*.JPG
:: Remote\*.NEF
:: Source\*.NEF
:: Print\*.JPG
 
Set "Edited=Edited"
Set "Remote=Remote"
Set "Source=Source"
Set "Print=Print"
Set "Root=."
 
:: Compare method:
:: DSC_2521.NEF
:: DSC_2521.JPG
 
:: 1.) Print\*.JPG - Source.NEF. При совпадении перенос .NEF --^> Print
For /F "delims=" %%a in ('dir /b /a "%Print%\*.JPG" 2^>NUL') do if exist "%Source%\%%~na.NEF" move /y "%Source%\%%~na.NEF" "%Print%\"
 
:: 2.) Edited\*.JPG - Source.NEF. При совпадении перенос .NEF--^> Edited
For /F "delims=" %%a in ('dir /b /a "%Edited%\*.JPG" 2^>NUL') do if exist "%Source%\%%~na.NEF" move /y "%Source%\%%~na.NEF" "%Edited%\"
 
:: 3.) Source\*.NEF - .\*.JPG. При несовпадении перенос .NEF--^> Remote
For /F "delims=" %%a in ('dir /b /a "%Source%\*.NEF" 2^>NUL') do if not exist "%Root%\%%~na.JPG" move /y "%Source%\%%~na.NEF" "%Remote%\"
 
:: 4.) Все файлы .NEF из Root\ -^> Перемещать в -^> Source
if exist "%Root%\*.NEF" move "%Root%\*.NEF" "%Source%\"
 
pause
1
dokxpi
5 / 5 / 0
Регистрация: 18.08.2013
Сообщений: 58
23.04.2015, 21:38  [ТС] 19
Цитата Сообщение от Dragokas Посмотреть сообщение
Тогда просто вот так:
Ну да, так будет логичнее всего, проверка здесь не к месту
Аплодирую стоя
Еще раз спасибо вам за ваше терпения и за чистоту в коде
0
23.04.2015, 21:38
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.04.2015, 21:38

Вирус заблокировал просмотр файлов JPG
Всем привет! Помогите мне пожалуйста! Нашла на вашем форуме ситуацию, которая приключилась со мной,...

Открытие файлов jpg, png и gif
Как реализовать на C++ открытие файлов jpg, png и gif через CFileDialog и их отображение в...

Шифровальщик заблокировал просмотр файлов JPG
После пойманного банера вируса на рабочей стол, перестали фотографии jpg показывать! Это не...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.