1

Тема: CMD/BAT: Сравнение файлов по размеру

Здравствуйте! Необходимо решение для следующей ситуации:
Имеются две директории с одинаковым набором видеофайлов, полностью совпадающих по размеру, но имеющих абсолютно разные названия. Иными словами, в первой директории находятся файлы с исходными именами, а во второй - те же файлы, но переименованные.
http://puu.sh/pginZ/24acdb75aa.pnghttp://puu.sh/pgipV/e232117910.png

Необходимо найти соответствия файлов между старым и новым названием на основе совподающего размера файлов в указанных директориях и переименовать в сопутствующем xml-файле новые названия файлов на исходные.

Т.е., если мы определили, что файлу из второй директории под названием "Title (2).mkv" соответствует исходное имя "Голубь сидел на ветке размышляя о бытии (2014).mkv", то в имеющемся в заданном расположении xml-файле необходимо заменить упоминания файла Title (2).mkv на Голубь сидел на ветке размышляя о бытии (2014).mkv.

Реально ли такое реализовать? Или, может, есть готовое решение? Спасибо!

2

Re: CMD/BAT: Сравнение файлов по размеру

becauseim
bat/cmd принципиальны? Просто в них редактировать файлы без сторонних средств неудобно.
XML по одному в источнике и получателе? В какой кодировке сохранены? Первая строка с кодировкой там есть?

3

Re: CMD/BAT: Сравнение файлов по размеру

Flasher, не принципиально. В основном, пользуюсь скриптами на AHK, но подумал, что для этой задачи больше подходит CMD.
XML только один, содержит информацию об уже переименованных файлах. Пример xml-файла. Не знаю, содержит ли он необходимую информацию.

Чтобы ситуация прояснилась, объясню цель необходимости. Существет Android-приложение для редактирования видео Adobe Premiere Clip, которое позволяет переносить готовый проект посредством облачного хранилища на компьтер для дальнейшего редактирования из настольного приложения. Но в сохраненном проекте (xml) имена исходных медиафайлов меняются, т.к. отправляемые в облако исходные медиа так же переименовываются, а необходимо получить в конечном итоге проект (xml) с исходными именами файлов.

4 (изменено: Flasher, 2016-06-04 17:52:11)

Re: CMD/BAT: Сравнение файлов по размеру

becauseim
Ясно. ANSI, значит. Могу сделать на vbs. Только не понял, где в залитом файле имена прописаны? У тега clipitem id?
Можно тогда и пути к директориям заодно написать.

Ладно, пока приведу решение. После уточнений поправлю.

+ VBScript:
InPut  = "C:\Input"
OutPut = "D:\OutPut"
FiMask = "*.avi;*.mkv;*.mov;*.mp4;*.flv"

Set ShAp = CreateObject("Shell.Application")
Set Dict = CreateObject("Scripting.Dictionary")
Set FSO  = CreateObject("Scripting.FileSystemObject")

Set Items = ShAp.NameSpace(InPut).Items
Items.Filter 8256, FiMask
For Each F in Items
  Dict.Add CStr(FSO.GetFile(F.Path).Size), F
Next
Set Items = ShAp.NameSpace(OutPut).Items
Items.Filter 8256, "*.xml"
If Items.Count = 1 Then
  XML = Items.Item(0).Path
  All = FSO.OpenTextFile(XML).ReadAll
  Items.Filter 8256, FiMask
  For Each F in Items
    Size = CStr(FSO.GetFile(F.Path).Size)
    If Dict.Exists(Size) Then All = Replace(All, F, Dict(Size))
  Next
  With FSO.OpentextFile(XML, 2) .Write All : .Close: End With
Else MsgBox "В папке " & OutPut & vbCr & _
     " должен находиться один xlm-файл!", 4144, " Правка XML"
End If

5

Re: CMD/BAT: Сравнение файлов по размеру

Flasher, большое спасибо! Позже протестирую Ваш сценарий, правда, не понял, куда прописывать путь имеющегося xml, а также путь для сохранения измененного xml. InPut и OutPut, как я понял, для директрии с файлами исходного наименования и директории с переименованными файлами.

не понял, где в залитом файле имена?

В этом проекте используется единственный файл (изображение). В переименованном виде его название: 0a8f432e-554d-412e-ab12-8c2fbe198d62

6

Re: CMD/BAT: Сравнение файлов по размеру

А что собираетесь  делать если будут файлы с одинаковым размером?

7 (изменено: Flasher, 2016-06-05 17:12:56)

Re: CMD/BAT: Сравнение файлов по размеру

becauseim
Про папки понято правильно. Ниже - маски с нужными расширениями.

becauseim пишет:

куда прописывать путь имеющегося xml, а также путь для сохранения измененного xml

Так ведь изначально требовалась правка сопутстующего xml, что и сделано. Про создание нового ничего не говорилось.

becauseim пишет:

В переименованном виде его название: 0a8f432e-554d-412e-ab12-8c2fbe198d62

Ага. В теге name. Ну, если все имена приходят в виде GUID, то можно оставить как есть.

Malcev
Если там будут только скачанные видео, то переживать по этому поводу уже не придётся.

8

Re: CMD/BAT: Сравнение файлов по размеру

Если там будут только скачанные видео, то переживать по этому поводу уже не придётся.

Смотря, чем закодированные.
С некоторыми кодеками вероятность весьма велика  - одинаковые по длительности будут иметь одинаковый размер.

9

Re: CMD/BAT: Сравнение файлов по размеру

Ни разу не встречал. по Мб - да, вполне, по Кб - крайне редко, по байтам - никогда.

10 (изменено: Malcev, 2016-06-06 01:49:21)

Re: CMD/BAT: Сравнение файлов по размеру

ftp://vqeg.its.bldrdoc.gov/MM/vga/
Так что, думаю, стоит ввести проверку на одинаковые размеры, чтобы пользователь мог сам выбрать файл на который заменять. А еще наверное лучше сравнивать побитово.

11 (изменено: Flasher, 2016-06-06 21:30:13)

Re: CMD/BAT: Сравнение файлов по размеру

Так это разделённые на части файлы. Разве о них может идти речь? Если всё же о таких зайдёт разговор, то добавлю для случая 3+ дубликата какую-нибудь утилиту/компонент подсчёта хэша (имел дело с разными) или использую встроенную fc, только всё это для больших файлов долгий процесс.

12

Re: CMD/BAT: Сравнение файлов по размеру

Flasher пишет:

ведь изначально требовалась правка сопутстующего xml

Т.е. xml для внесения правок по умолчанию должен находится рядом с файлом скрипта?

Malcev пишет:

А что собираетесь  делать если будут файлы с одинаковым размером?

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

13 (изменено: Malcev, 2016-06-06 02:11:53)

Re: CMD/BAT: Сравнение файлов по размеру

Так это разделённые на части файлы.

С чего вы так решили?
Это просто некомпрессированное видео в формате raw.
На автохотки хеш подсчитать можно так.
Довольно шустро работает:
http://www.ghisler.ch/wiki/index.php/Au … le_compare

14

Re: CMD/BAT: Сравнение файлов по размеру

becauseim пишет:

Т.е. xml для внесения правок по умолчанию должен находится рядом с файлом скрипта?

Зачем? Когда речь шла о сопуствующем xml, разве не папка получателя имелась в виду?

Malcev
Сперва показалось, что там одноимённые файлы со счётчиком. По ссылке MD5, он не достаточно надёжен. Нужен хотя бы sha1. Поэтому я бы взял hashfile или rhash, поддерживающие Юникод.

15

Re: CMD/BAT: Сравнение файлов по размеру

Flasher, к сожалению, не понимаю, что Вы имеете в виду. Обычно папка с переименованными файлами находится рядом с  xml-файлом (media).
http://puu.sh/pidcF/5fe48bf608.png

16

Re: CMD/BAT: Сравнение файлов по размеру

becauseim
Понятно. Так что требуется в итоге? Править существующий или создавать новый?

17

Re: CMD/BAT: Сравнение файлов по размеру

Тут определяют и crc32 и md5 и sha1.
https://autohotkey.com/board/topic/5957 … 5-and-md5/
Наверное и на VBS можно переписать?
Кстати, а в чем разница между ними тремя и какой из них надежней?

18 (изменено: Flasher, 2016-06-06 21:31:03)

Re: CMD/BAT: Сравнение файлов по размеру

Malcev
Вряд ли можно без DynamicWrapperX. Плюс я не знаю, как в цикле очищается память? Через CloseHandle? Да и запись длиннее сама по себе, через fc вооще одной строчки достаточно. Надо бы сравнить скорость.

19

Re: CMD/BAT: Сравнение файлов по размеру

Flasher, думаю, для чистоты теста, создавать новый.

20

Re: CMD/BAT: Сравнение файлов по размеру

becauseim
ОК. А имя исходного XML несменно? Т.е. его константой можно задать или всё же искать в папке?
И ещё вопрос - файлы с GUID-имена вообще без расширений?

21

Re: CMD/BAT: Сравнение файлов по размеру

Flasher, не совсем Вас понимаю. Могу сказать, что каждый новый проект несет уникальное имя, а файлы с названиями, используемыми в проекте чаще всего лежат рядом в папке "media". Думаю, что аналогично с переменными InPut и OutPut логично добавить SourceXML и TargetXML. Про GUID мне тоже сложно ответить, но могу сказать, что в последний прикрепленный проект мною импортировался единственный медиафайл (.jpg).

22

Re: CMD/BAT: Сравнение файлов по размеру

becauseim
В таком случае лучше создать переменные, чтобы скрипты не плодить. Обошёлся без TargetXML, там счётчик будет.
Про GUID было написано

becauseim пишет:

В переименованном виде его название: 0a8f432e-554d-412e-ab12-8c2fbe198d62

Тут нет расширения. Вот и спрашиваю.

23

Re: CMD/BAT: Сравнение файлов по размеру

Как это нету. В XML имеем:

<pathurl>media/65f4ee6e-cccc-494a-862b-c2cba320d616.3gp</pathurl>    ; путь к файлу
<name>65f4ee6e-cccc-494a-862b-c2cba320d616</name>   ; его имя показывающиеся в премьере

24

Re: CMD/BAT: Сравнение файлов по размеру

Понятно. Значит, только базовые имена на замену.
Но вот что делать, если в источнике и/или получателе есть дубликаты (т.е. 2 и более)? Переименовывать тем, который первый на очереди? А второй, третий и т.п. дубликат чем переименовывать?

25

Re: CMD/BAT: Сравнение файлов по размеру

Мне кажется, что было бы правильно переименовывать так.
Это:

<pathurl>media/65f4ee6e-cccc-494a-862b-c2cba320d616.3gp</pathurl>    ; путь к файлу
<name>65f4ee6e-cccc-494a-862b-c2cba320d616</name>   ; его имя показывающиеся в премьере

На это:

<pathurl>media/file1.3gp</pathurl>    ; путь к файлу
<name>file1.3gp</name>   ; его имя показывающиеся в премьере

В проекте Premiere Pro отображаются видео с расширением, это уже Premiere Clip чудит.
Кстати в проете еще могут быть теги:

<ClipName>file1.3gp</Clipname>

26 (изменено: Flasher, 2016-06-07 02:38:59)

Re: CMD/BAT: Сравнение файлов по размеру

Malcev пишет:

Мне кажется, что было бы правильно переименовывать так.

Это и так понятно, я про другое спрашивал.

becauseim, причём этот вопрос больше даже к Вам был адресован.