Как Сделать “Diff -R” Unix В Windows Cmd Prompt?

Fc – сравнение файлов.

3

Команда FC позволяет сравнить содержимое двух или нескольких файлов.

Формат командной строки:


FC [/A] [/C] [/L] [/LBn] [/N] [/OFF[LINE]] [/T] [/U] [/W] [/nnnn][диск1:][путь1]имя_файла1 [диск2:][путь2]имя_файла2

или

FC /B [диск1:][путь1]имя_файла1 [диск2:][путь2]имя_файла2

/A – Вывод только первой и последней строк для каждой группы различий.

/B – Сравнение двоичных файлов.

/C – Сравнение без учета регистра символов.

/L – Сравнение файлов в формате ASCII.

/Lbn – Максимальное число несоответствий для заданного числа строк.

/N – Вывод номеров строк при сравнении текстовых файлов ASCII.

/OFF[LINE] – Не пропускать файлы с установленным атрибутом “Автономный”.

/T – Символы табуляции не заменяются эквивалентным числом пробелов.

/U – Сравнение файлов в формате UNICODE.

/W – Пропуск пробелов и символов табуляции при сравнении.

/nnnn – Число последовательных совпадающих строк, которое должно встретиться после группы несовпадающих.

[диск1:][путь1]имя_файла1 – Указывает первый файл или набор файлов для сравнения.

[диск2:][путь2]имя_файла2 – Указывает второй файл или набор файлов для сравнения.

Для получения краткой справки используется параметр /?:
FC /?

Если в командной строке не задан параметр /B то сравнение выполняется построчно, с выводом результатов в виде имен файлов и несовпадающих строк:


Сравнение файлов FILE1.TXT и FILE2.TXT

***** FILE1.TXTline

line1
line2
head

***** FILE2.TXT

строка1
строка2
head
*****

В приведенном примере не совпало содержимое первых 2-х строк в файлах FILE1.TXT и FILE2.TXT. Кроме не совпавших строк, в результатах сравнения отображается первая совпавшая после них строка ( head )

Если выполняется команда сравнения двоичных файлов FC /B, то независимо от формата данных, выполняется побайтное сравнение с выдачей результатов в виде:


Сравнение файлов file1.txt и file2.txt

00000001: 6C 31
00000002: 69 44
Строка 00000001: 6C 31 – означает, что смещение от начала файла равно 00000001 . В файле file1.txt поданному смещению находится байт с шестнадцатеричным значением 6C, а в файле file2.txt – 31

Примеры использования FC.EXE:

fc /b etalon.exe C:windowssystem32notepad.exe – сравнить двоичный файл etalon.exe из текущего каталога с файлом C:windowssystem32notepad.exe

fc /b D:windowssystem32dllcache*.exe D:windowssystem32*.* | more – сравнить группы двоичных файлов с расширением exe из каталога D:windowssystem32dllcache с файлами из каталога D:windowssystem32.
Благодаря использованию команды FC в цепочке с командой more, выдача результатов на экран выполняется в постраничном режиме.

fc C:Documents*.txt D:documents*.* > C:compare.txt – сравнить текстовые файлы в разных каталогах с записью результатов в файл C:compare.txt.

FC /LB2 C:Documents*.txt D:documents*.* > C:compare.txt – как и в предыдущем случае, но в результатах сравнения будут отображаться не более 2-х несовпадений.

Параметр /nnn позволяет управлять продолжением выполнения сравнения файлов. Например, имеется 2 текстовых файла file1.txt и file2.txt, в которых 1-я и 4-я строки различаются, а 2-я и 3-я – совпадают. В зависимости от значения /nnn утилита FC.EXE может либо прекратить дальнейшее сравнение файлов, либо продолжить:

FC /2 file1.txt file2.txt – после первой не совпавшей строки имеются 2 совпавшие ( 2-я и 3-я строки – одинаковые) – сравнение файлов будет продолжено.

FC /3 file1.txt file2.txt – параметр /3 требует наличия 3- х совпадающих строк после несовпадения, поэтому дальнейшее сравнение файлов будет прекращено.

FC /A /L /C file1.txt file2.txt – выполнить сравнение текстовых файлов в формате ASCII , без учета регистра символов, с отображением только первой и последней строк для каждой группы различий.

В командных файлах, для проверки результата сравнения файлов используется анализ значения переменной ERRORLEVEL.

По результату выполнения операции сравнения, переменная ERRORLEVEL может принимать следующие значения:

0 – файлы совпали.

1 – файлы не совпали

2 – ошибка открытия файла ( файл не найден)

Пример командного файла :


@echo off
fc file1.txt file2.txt > nul
if ERRORLEVEL 1 goto Different
echo Файлы совпадают
REM подпрограмма, выполняющаяся при совпадении файлов. . .
exit
:Different
echo Файлы НЕ совпадают
REM подпрограмма, выполняющаяся при различии файлов. . .

For – организация циклической обработки

Команда FOR используется для выполнения команды, заданной в виде параметра, для каждого элемента из набора. В качестве элементов могут
использоваться файлы, каталоги, наборы строк.

Формат командной строки:

FOR %переменная IN (набор) DO команда [параметры]

Параметры:

%переменная – Однобуквенный подставляемый параметр.

(набор) – Определяет набор, состоящий из одного или нескольких
элементов, обрабатываемых командой.

команда – Команда, которую следует выполнить для каждого элемента набора.

параметры – Параметры для команды, выполняемой по отношению к элементам набора.

.

В пакетных файлах для команды FOR используется запись

%%переменная вместо %переменная. Имена переменных
учитывают регистр букв (%i отличается от %I).

Поддерживаются также дополнительные форма команды FOR:

FOR /D %переменная IN (набор) DO команда [параметры]

Ключ /D задает в качестве набора имена каталогов (не файлов).

FOR /R [[диск:]путь] %переменная IN (набор) DO команда [параметры]

Ключ /R задает выполнение команды для каталога [диск:]путь, а также для всех
подкаталогов этого пути. Если после ключа /R не указано имя
каталога, используется текущий каталог. Если набор – это
одиночный символ точки (.), команда просто перечисляет дерево каталогов.

:/>  Работа с переменными окружения в командной строке (CMD) -

FOR /L %переменная IN (начало,шаг,конец) DO команда [параметры]

Ключ /L задает обработку набора из последовательности чисел с заданными
началом, концом и шагом приращения. Так, набор (1,1,5) раскрывается в (1 2 3 4 5), а набор (5,-1,1) – в (5 4 3 2 1)

FOR /F [“ключи”] %переменная IN (набор-файлов) DO команда [параметры]

FOR /F [“ключи”] %переменная IN (“строка”) DO команда [параметры]

FOR /F [“ключи”] %переменная IN (‘команда’) DO команда [параметры]

Ключ /F задает обработку файлов, строковых значений или результатов стандартного вывода другой команды. Набор файлов – содержит имена одного или нескольких файлов,
которые по очереди открываются, читаются и обрабатываются.
Обработка состоит в чтении файла, разбивке его на отдельные
строки текста и разборе каждой строки в ноль или более подстрок.
Затем вызывается тело цикла “for”, при выполнении которого
каждая найденная подстрока используется в качестве значения
переменной. По умолчанию ключ /F выделяет из каждой строки
каждого файла первую отделенную пробелами подстроку. Пустые
строки в файле пропускаются. Необязательный параметр “ключи”
служит для переопределения правил разбора по умолчанию. Он
представляет собой заключенную в кавычки строку, содержащую
одно или несколько ключевых слов для определения параметров
разбора. Ключевые слова:

eol=символ – знак начала комментария в конце строки ( признак конца обрабатываемых данных строки). Задается в виде одиночного символа.

skip=n – число пропускаемых при обработке строк от начала
файла.

delims=xxx – набор разделителей между обрабатываемыми элементами строк. По
умолчанию, в качестве разделителей используются пробелы и знаки табуляции.

tokens=x,y,m-n – номера подстрок из каждой строки, передаваемые в тело
цикла “for” для каждой итерации. Например, для обычного текстового файла, подстроками будут слова, а разделителями подстрок – пробелы или знаки табуляции. При использовании этого ключа выделяются дополнительные имена переменных. Формат m-n представляет собой диапазон подстрок с номерами от m по n. Если последний знак
в строке tokens= является звездочкой, то создается
дополнительная переменная, значением которой будет
весь оставшийся текст в строке после разбора
последней подстроки.

usebackq – режим обработки кавычек. Строка,
заключенная в обратные кавычки, выполняется как
команда, строка, заключенная в прямые одиночные
кавычки, является строкой символов, а двойные
кавычки могут использоваться для задания имен
файлов, содержащих пробелы.

Поясняющий пример:

FOR /F “eol=; tokens=2,3* delims=, ” %i in (myfile.txt) do @echo %i %j %k

Выполняется разбор файла myfile.txt. Все строки, которые
начинаются с символа точки с запятой (eol=; ), пропускаются. Вторая и
третья подстроки из каждой строки ( tokens=2,3 ) передаются в тело цикла “for”, причем
подстроки разделяются запятыми и/или пробелами.
В теле цикла переменная %i принимает значение второй
подстроки, %j – третьей, а %k – все оставшееся
поле до конца строки после третьей подстроки . Имена файлов, содержащие пробелы,
необходимо заключать в двойные кавычки. Чтобы использовать
двойные кавычки, необходимо использовать параметр usebackq,
иначе двойные кавычки будут восприняты как определение
строки-литерала для разбора.

В данном примере переменная %i явно объявлена в инструкции “for”, а переменные
%j и %k объявляются неявно с помощью ключа tokens= .
Ключ tokens= позволяет извлечь из одной строки файла до
26 подстрок. Следует помнить, что имена переменных FOR являются однобуквенными,
с учетом регистра, поэтому одновременно не может быть активно более 52 переменных, задаваемых как явно, так и неявно.

Команда FOR /F может также использоваться для обработки
явно заданной строки, заключенной в одиночные кавычки и
указанной в качестве параметра в скобках. Она будет разобрана
так же, как одиночная строка, считанная из входного файла.

В качестве обрабатываемого набора, также,
может быть использован вывод ( выходные
данные ) другой команды. В этом случае используется
в качестве параметра в скобках строка в обратных одиночных
кавычках
. Эта строка передается для выполнения дочернему
обработчику команд CMD.EXE, а вывод этой команды
сохраняется в памяти и разбирается так, как если бы это
был файл. Пример:

FOR /F “usebackq delims==” %i IN (`set`) DO @echo %i,

Выполняется команда SET, отображающая значения переменных среды и команда FOR /F выведет их перечень с использованием команды echo .

В команде FOR возможно использование ссылок на переменные.
Допускается применение следующих синтаксических конструкций:

%~I – из переменной %I удаляются обрамляющие кавычки (“)
%~fI – переменная %I расширяется до полного имени файла
%~dI – из переменной %I выделяется только имя диска
%~pI – из переменной %I выделяется только путь к файлу
%~nI – из переменной %I выделяется только имя файла
%~xI – из переменной %I выделяется расширение имени файла
%~sI – полученный путь содержит только короткие имена
%~aI – переменная %I расширяется до атрибутов файла
%~tI – переменная %I расширяется до даты /времени файла
%~zI – переменная %I расширяется до размера файла
%~$path:I – проводится поиск по каталогам, заданным в переменной среды path, и переменная %I заменяется на полное имя первого найденного файла.
Если переменная path не определена или в результате поиска не найден ни один файл, то этот модификатор заменяется на пустую строку.

:/>  Пропала корзина с рабочего стола Windows 7/10 – как восстановить значок

При объединении нескольких операторов можно получить следующие результаты:

~dpI – переменная I раскрывается в имя диска и путь
~nxI – переменная I раскрывается в имя файла и его расширение
~fsI – переменная I раскрывается в полный путь с короткими именами
~dp$path:I – проводится поиск по каталогам, заданным в переменной среды path, и переменная I раскрывается в имя диска и путь к первому найденному файлу.
~ftzaI – переменная I раскрывается в строку, подобную выдаваемой командой DIR

В приведенных выше примерах переменные I и path можно
заменить на другие допустимые значения. Синтаксическая
конструкция с символами ~ заканчивается допустимым именем
переменной цикла FOR.

Для имен переменных рекомендуется использовать заглавные
буквы, например –I, что делает эту конструкцию более удобной
для чтения и предотвращает ошибочное принятие их за
модификаторы, которые не различают регистр.

При использовании команды FOR в командных файлах, если внутри цикла нужно выполнить более одной команды, то они заключаются в скобки:

FOR %переменная IN (набор) DO (
команда1 [параметры]команда2
. . .
)

Пример:


@echo OFF
for /L %%I in (1,1,5) DO (
echo FIRST%%I
ECHO LAST%%I
)

Обычно, в командных файлах команда FOR используется не только для разбора данных, но и их обработки, что требует использования переменных внутри цикла FOR. И здесь возникает проблема – изменения значений переменных не происходит, т.е. их применение внутри скобок невозможно. Подобное явление вызвано не логическими предпосылками, а всего лишь определенными особенностями реализации командного процессора CMD.EXE, и это нужно обязательно учитывать при обработке переменных внутри циклов команд FOR и IF. Другими словами, использование значений переменных внутри скобок, требует изменения стандартного режима интерпретации командного процессора. Разработчиками предусмотрена возможность запуска CMD.EXE с параметром /V:ON, что включает разрешение отложенного расширения переменных среды с применением символа восклицательного знака (!) в качестве разделителя. То есть, параметр /V:ON разрешает использовать !var! в качестве значения переменной var во время выполнения внутри циклов команд FOR и IF. Но на практике чаще используется возможность локального включения данного режима внутри командного файла специальной директивой:

Setlocal EnableDelayedExpansion

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


Setlocal EnableDelayedExpansion
@ECHO OFF
set VAR=before
if “%VAR%” == “before” (
set VAR=after
if “!VAR!” == “after” @echo Со знаком процента=%VAR% , Со знаком вопроса=!VAR!
)

Команда set VAR=after выполняется внутри подпрограммы, ограниченной скобками и, если убрать команду Setlocal EnableDelayedExpansion или не использовать для получения значения переменной VAR восклицательные знаки, ее значение останется старым ( тем, что было установлено до входа в цикл команды FOR ).

Данная особенность реализации командного процессора Windows нередко приводит к неожиданным результатам при использовании групп команд, объединенных скобками в конструкциях FOR и IF и тогда, когда значение какой-либо переменной изменяется внутри цикла с одной командой. Например, для получения списка файлов текущего каталога такой командный файл работать не будет:


set LIST=
for %%i in (*) do set LIST=%LIST% %%i
echo %LIST%

Вроде бы, логически все верно, но не учтена особенность обработки значений переменных. Значение переменной LIST внутри цикла команды FOR изменено не будет, оно останется пустым ( задано командой SET LIST= ), каким и было на начало цикла FOR. Команда SET LIST= %LIST% %%I должна в каждом цикле менять значение переменной LIST на текущее, плюс символ пробела, и плюс текущее значение переменной I, которое принимает значение имени файла в текущем каталоге. Синтаксически, команда верная, но из-за озвученной выше особенности реализации командного процессора – не работает, и значение переменной LIST не изменяется. Для того, чтобы это произошло, командный файл нужно изменить, таким же образом, как и в примере для группы команд:


Setlocal EnableDelayedExpansion
set LIST=
for %%i in (*) do set LIST=!LIST! %%i
echo %LIST%

Теперь, значение переменной LIST внутри цикла FOR будет
изменяться, последовательно принимая значения имен файлов, разделенных
пробелом ( set LIST=!LIST! %%i).

Эту особенность реализации CMD нужно учитывать и при использовании значений системных переменных внутри циклов, как например, переменной ERRORLEVEL:

IF !ERRORLEVEL!==0 вместо %ERRORLEVEL%==0

Как сделать "diff -r" unix в windows cmd prompt?

Частичное решение с ROBOCOPY

Частичное решение (и, следовательно, для меня, к сожалению, это “не-решение”, хотя я и возлагал на него большие надежды), что может быть или не быть достаточно для вас:

Кажется, Инструмент ROBOCOPY может быть (ab-) использован для того, чтобы работать как ребяческое рекурсивное сравнение с недобросовестными людьми; с несчастливым ограничением, что он, по-видимому, не сравнивает содержимое файла. Кажется, он сравнивает размеры, даты и необязательные атрибуты. Волшебное заклинание для этого было бы:

ROBOCOPY path1 path2 /e /l /ns /njs /njh /ndl /fp /log:result.txt /it

где параметрыЗначение кажется следующим:

:/>  Как запустить от имени Администратора в Windows 10: 8 способов открыть файл

    /e – recurse, включая пустые каталоги;
    /l распечатать только журнал, не изменять файлы;
    /ns /njs /njh – не печатать размеры файлов, резюме задания, заголовок задания;
    /ndl – “не записывать имена папок”

      ПРИМЕЧАНИЕ: это, как сообщается, приведет к пропущению случаев отсутствия/лишних пустых директорий; если вы не используете это, те должны войти в систему, но вам придется каким-то образом удалить не различающиеся диски другими способами;

    /log:result.txt – записывать результаты в файл result.txt; Я думаю, что это можно опустить, и результат будет показан на стандартном выходе.

Дополнительные параметры:

Как я уже говорил, это, похоже, не сравнивает содержимое файла, к сожалению. Я проверил это, выполнив следующую команду:

mkdir d1ab d2ab & echo x > d1abf & echo y > d2abf

В большинстве случаев это должно создавать файлы d1abf и d2abf с одинаковыми отметками времени, вы можете проверить с помощью dir d1abf d2abf. Вызов robocopy на d1 и d2 дал пустой набор результатов для меня.

Утилита find командная строка

FIND [/V] [/C] [/N] [/I] [/OFF[LINE]] “искомые_значения” [[диск:][путь]имя_файла[ …]]

И так, смотрим на описание ключей:

[/V] – произвести вывод всех строк, которые НЕ содержат заданной.

[/C] – выводится только общее число строк, содержащих заданную.

[/N] – Вывод номеров отображаемых строк.

[/I] – Поиск без учета регистра символов.

[/OFF[LINE]] – Не пропускать файлы с установленным атрибутом “Автономный”.

“искомые_значения” – собственно, строчка, поиск которой производится из командной строки Windows

[[диск:][путь]имя_файла[ …]] – тут мы прописываем один или несколько имен документов, в которых нужно произвести поиск через командную строку, можно использовать подстановочные знаки.

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

Создадим на диске D: папку TEST, в который благополучно поместим три файла с расширениями  .pdf, .txt и .mf. Для начала попробуем найти слово “const” во всех документах с расширением txt:

FIND “const” D:TEST*.txt

На выходе мы получим следующую информацию:

Утилита findstr командная строка

Утилита CMD FINDSTR  предоставляется возможность осуществить поиск текста через командную строку не только в одном файле, или группе документов заданных по шаблону, но и с возможностью загрузки готового списка. И так, прежде всего, давайте посмотрим на основной синтаксис.

FINDSTR [/B] [/E] [/L] [/R] [/S] [/I] [/X] [/V] [/N] [/M] [/O] [/P] [/F:файл][/C:строчка] [/G:файл] [/D:список_папок] [/A:цвета] [/OFF[LINE]] “искомые_значения”[[диск:][путь]имя_файла[ …]]

/B – Данный ключ определяет поиск образца лишь в началах строчек.

/E – Данный ключ определяет поиск образца лишь в конце.

/R – Фразы и слова будут приниматься как регулярные выражения.

/S – Производит поиск файлов через командную строку в текущем каталоге и всех его подпапках.

/I – Данный ключ определяет, что поиск фразы из командной строки будет вестись без учета регистра.

/X – Производит вывод только тех строчек, которые содержат точное совпадение.

/V – Производит вывод только тех строчек, которые не содержат точного совпадения с искомой фразой.

/N – Производит вывод номера строчки (которые содержат точное совпадение) и ее содержимое.

/M – Производит вывод лишь имени документа, который содержит совпадение.

/O – Вывести список найденных строк через пустую строчку.

/P – Данный параметр определяет, что произойдет пропуск всех строк, которые содержат непечатаемые символы.

/OFF[LINE] – Не пропускает те документы, у которых установлен атрибут “Автономный”.

/A:цвета – Шестнадцатеричный код цвета, для получения справки можете ввести команду “COLOR /?”

/F:файл – Производит чтение списка файлов из заданного документа.

/C:строчка – Использовать значение данного параметра как искомую фразу поиска.

/G:файл – Позволяет получить список строк из заданного документа.

/D:список_папок – Тут через точку с запятой мы можем задать список каталогов, в которых нужно произвести поиск через командную строку.

“искомые_значения” – Собственно, то, что мы ищем.

[диск:][путь]имя_файла – Задаем путь к документу (документам)

Что бы разделить между собой искомые фразы, между ними вставляется пробел, если параметр не содержит префикса /C. Например,

FINDSTR “Привет мир” data.txt

ищет “Привет” или “мир” в файле data.txt, а команда

FINDSTR /C:”Привет мир” data.txt

ищет фразу “Привет мир” в  файле data.txt.

Регулярные выражения являются своеобразным бонусом, которым не то, что оболочка, но и язык программирования не всегда может похвастаться. При поиске из командной строки, регулярные выражения позволяют задавать собственные шаблоны (для справки по некоторым значениям введите в cmd findstr/? ), они также используются в сценариях сервера Windows Script Host, за это отвечает отдельный объект.

Оставьте комментарий