Linux сравнить две директории

Сравнение файлов в Linux (команда diff)

Для сравнения двух или нескольких файлов в Linux есть команда diff . Она может сравнивать как отдельные файлы, так и каталоги. Рассмотрим синтаксис, опции команды diff и несколько примеров использования.

Синтаксис команды diff

Команда diff имеет следующий синтаксис:

Мы указываем опции и подаем на вход два или более файлов или директорий, которые нам нужно сравнить.

Опции команды diff

Рассмотрим основные опции команды diff. Я рассмотрю только те опции, которые сам использую наиболее часто.

-E игнорировать изменения, связанные с добавлением символа табуляции в тексте.
-b игнорировать изменения, связанные с добавлением пробелов.
-w игнорировать изменения, связанные с добавлением пробелов и табуляции.
-B игнорировать новые пустые строки.
-p (или —show-c-function) показать название функции языка C, в которой найдены изменения.
-y (или —side-by-side) отобразить результаты в две колонки.
-r просматривать каталоги рекурсивно.
-X FILE исключить из поиска файлы, имена которых совпадают с шаблонами в файле FILE.
-d (или —minimal) попытаться найти как можно меньше изменений (то есть исключить ложные срабатывания).

Примеры использования команды diff

Сравнение двух текстовых файлов

Для простого сравнения двух текстовых файлов с именами myfile1 и myfile2 выполним в терминале команду:

Вывод команды diff удобно перенаправить в файл с расширением diff . Большинство текстовых редакторов в Linux, например Gedit, распознают этот файл и подсвечивают его синтаксис. Чтобы направить результат сравнения в файл changes.diff нужно использовать символ перенаправления потока (>):

Сравнение директорий, содержащих текстовые файлы

Рассмотрим пример сравнения двух директорий ( mydir1 и mydir2 ), которые содержат текстовые файлы. Основное отличие здесь от примера выше состоит в том, что мы добавим опцию -r , означающую рекурсивный обход файлов в директориях.

Теперь предположим, что в директориях, в которых мы сравниваем файлы, находится много «мусора», который мы не должны сравнивать. Создадим файл excludeFiles и запишем в него шаблоны и названия файлов, которые мы не должны сравнивать. Например, содержимое excludeFiles может иметь вид:

Теперь укажем команде diff, чтобы она использовала наш файл excludeFiles при сравнении каталогов:

Таким образом, мы сравниваем файлы, имена которых не попадают под шаблоны в файле excludeFiles , например, vasya.exe или ChangeLog12 .

Добавим еще несколько опций, которые описаны выше, чтобы улучшить результат сравнения:

Мы сравниваем файлы в директориях mydir1 и mydir2 , игнорируя изменения, связанные с добавлением пустых строк, пробелов, табуляции, а также используем шаблоны имен файлов в excludeFiles , чтобы исключить из сравнения ненужные файлы.

Заключение

Дополнительную информацию по использованию команды diff в вашей системе Linux вы можете получить, выполнив команду:

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

Источник

Как сравнить различия между каталогами (Linux)

У меня есть две директории — одна из более ранней резервной копии и вторая из новейшей резервной копии. Как сравнить, какие изменения были внесены в файлы в каталоге из новейшей резервной копии в Linux? Также, как мне отобразить изменения, например, в текстовых и php файлах — я думаю о чем-то вроде истории изменений в Википедии, где вы видите старую версию на одной стороне экрана и самую новую версию на другой, и изменения подсвечиваются. Как мне достичь чего-то подобного?

Читайте также:  Как установить загрузочную флешку linux mint

Редактировать: Как я могу также сравнить удаленный каталог с локальным?

Из справочной страницы diff:

Если оба файла from-file и to-file являются каталогами, diff сравнивает соответствующие файлы в обоих каталогах в алфавитном порядке; это сравнение не является рекурсивным, если не задана опция -r или —recursive. diff никогда не сравнивает фактическое содержимое каталога, как если бы это был файл. Файл, который полностью указан, может не быть стандартным вводом, потому что стандартный ввод является безымянным и понятие «файл с тем же именем» не применяется.

Итак, для сравнения каталогов: diff —brief -r dir1 dir2

Чтобы сравнить файлы рядом: diff —side-by-side file1 file2

  • мы находимся www1 , сравнивая с удаленным www2
  • есть аутентификация с открытым ключом от локального www1 к удаленному www2
  • мы сравниваем как одного и того же пользователя на локальном www1 и удаленном www2

Вы действительно хотите объединить мощность, rsync чтобы уменьшить потребление полосы пропускания с мощностью, diff чтобы дать вам гибкие, ну и отличия.

Так что-то вроде этого:

Я думаю, вы могли бы немного подправить это, если бы вы делали это часто, rsync а не cp в первой строке — очевидно, в последней строке у вас есть все возможности diff для форматирования, как вам нравится. Вероятно, с у в случае ОП

Недостатком этого подхода является то, что вы в конечном итоге используете вдвое больше локального пространства, но при этом менее чем на 1 долл. / Гиг, кого это волнует?

Делайте diff old_dir new_dir > diff.txt для параллельных различий на одном сервере.

Для удаленных файлов:

Например: ABC — это существующий сервер, а XYZ — ваш удаленный сервер, а имя каталога — 123.

Шаг 1: Переименуйте существующий каталог 123 на ABC Server как 123_ABC.

Шаг 2: Создайте новый каталог на сервере ABC:

Шаг 3: Скопируйте все файлы из каталога 123 на сервере XYZ в каталог 123_XYZ на сервере ABC:

Это скопирует все файлы из каталога на вашем XYZ-сервере в каталог ABC server / 123_XYZ.

Шаг: 4: Сделайте различие между обоими каталогами:

Теперь перейдите на сервер ABC и выполните различие между 123_ABC и 123_XYZ.

Команда выше сохранит результаты diff в diff.txt по тому же пути.

Вы можете сравнить различия тогда.

AIDE Advanced Intrusion Detection Environment (AIDE) является проверка целостности файлов для операционных систем UNIX. Его целью является предоставление отчетов о целостности данных в поддерживаемых файловых системах. Несколько раз запустив AIDE на целевом хосте, вы можете определить, какие файлы меняются. Запустив AIDE несколько раз на разных хостах, вы можете определить, какие файлы и разрешения отличаются. Затем используйте инструмент gui diff для указанных «разных» файлов.

Или используйте инструмент gui diff, такой как meld, guiffy, kdiff3, diff, vimdiff, gvimdiff, Emacs, Kompare, Diffuse, Easydiff, TkDiff или xxdiff. Большинство из них будет делать различия в каталогах в дополнение к различиям в файлах. Вам нужно будет смонтировать удаленный диск, используя NFS, SMBFS или SSHFS, как уже упоминали другие.

Или вы можете использовать два файла с выходом списка файлов. А затем сравните эти два файла. Например:

Загрузите один из файлов.

Используйте diff ( diff -y remote-files local-files > diff-files ), чтобы сравнить их рядом. Откройте diff-файлы и проверьте его. Каждая строка с> означает другой файл.

Источник

Чем сравнить две директории в Linux? С помощью Diff и Meld Tools

Для тех пользователей линукс мира, у кого как и у меня, время от времени возникает необходимость сравнения файлов и директорий, решил написать эту небольшую статью, о двух прекрасных, на мой взгляд, утилитах — утилита командной строки diff и утилита с графическим Meld Tools. Опережая реакцию неосиляторов и не желающих разбираться самостоятельно, ответственно заявляю, эта статья лишь ознакомительная, и не претендует на роль мануала, посему не буду подробно расписывать как сравнивать файлы и директории в Diff и Meld, тем более они имеют, на мой взгляд, интуитивно понятный интерфейс, разобраться в котором сможет даже бабушка, ну или дедушка. К слову сказать, в настоящее время у меня есть очень явный пример того, что линукс в целом и информационные технологии, в частности, всем возрастам покорны. В Manjaro группе в телеграмме, есть у нас товарищ, ему 61 год, с компьютером он познакомился в 55 лет, ныне пенсионер и всю жизнь проработал шахтёром. Так вот от него вопросов по настройке и помощи в линуксе слышно меньше, чем от 20-25 летних юнцов.

Читайте также:  Linux mint with kodi

Что-то я ушёл от темы. Итак, обычно для того, чтобы сравнить два файла в Linux, я использую

. Если честно пользуюсь ей я ни потому, что я прям вот обожаю до ужаса этот волшебный мир консоли хотя да, он великолепен, а потому что diff есть «из коробки»в большинстве, если во всех дистрибутивах Linux, и если возникает необходимость сравнения файлов на чужом компьютере, то легче всего открыть терминал и использовать diff.

Так вот для сравнения двух каталогов достаточно выполнить простейшую команду:
diff -q directory-1/ directory-2/
Так это выглядит у меня
Если вам необходимо сравнить рекурсивно, со сравнением поддиректорий, то используйте ключ -r.

Вторая утилита о которой хочу рассказать, это графическая утилита которая позиционируется, как инструмент визуального сравнения и слияния для рабочего стола GNOME, но конечно же, не будет преступлением использовать её и с другими окружениями рабочего стола. Устанавливается она простым вводом одной команды:
sudo pacman -S meld [Archlinux и его производные]
sudo apt install meld [Debian/Ubuntu и его производные]
sudo yum install meld [RHEL/CentOS и его производные]
sudo dnf install meld [Fedora 22+ и его производные]

Так выглядит её интерфейс

Как я написал выше, разберется в нём и стар и млад, учиться никогда не поздно. Благо в линуксе каждый найдёт для себя то, что ему нравится, кто-то фанатеет от консольки и работает только в ней, кто-то любит графические интерфейсы. Если у кого то возникнут вопросы, не стесняйтесь спрашивайте в комментариях всегда открыт к диалогу.

Источник

Разница между двумя каталогами в Linux

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

проблема с вышеуказанной командой в том, что она находит оба файла в dir1 а не dir2 а также файлы dir2 а не dir1 ,

Я пытаюсь найти файлы dir1 а не dir2 только.

вот небольшой пример того, как выглядят мои данные

другой вопрос на мой взгляд, как я могу найти файлы в dir1 а не dir2 или dir3 в одной команде?

14 ответов

пояснение:

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

diff -r dir1 dir2 | grep dir1 показывает, какие файлы находятся только в dir1

Читайте также:  При открытии файла журнала c windows system32 logfiles sum api log

awk для печати только имени файла.

Это должно сделать работу:

параметры объяснены (через diff (1) man page):

  • -r — рекурсивно сравните все найденные подкаталоги.
  • -q — вывод только в том случае, если файлы отличаются.

эта команда даст вам файлы, которые находятся в dir1 и не в директория dir2.

о знак, вы можете Google это, как подмена процесса.

хороший способ сделать это сравнение, чтобы использовать find С md5sum , потом diff .

использовать find чтобы перечислить все файлы в каталоге, вычислите хэш md5 для каждого файла и передайте его в файл:

выполните ту же процедуру в другом каталоге:

затем сравните результат двух файлов с «diff»:

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

еще один хороший способ сделать эту работу-использовать git

С наилучшими пожеланиями!

Meld (http://meldmerge.org/) делает большую работу по сравнению каталогов и файлов внутри.

vim DirDiff плагин-еще один очень полезный инструмент для сравнения каталогов.

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

другой (возможно, более быстрый для больших каталогов) подход:

на sed команда удаляет первый компонент каталога благодаря)

Это немного поздно, но может кому-то помочь. Не уверен, что diff или rsync выплевывают только имена файлов в голом формате, как это. Спасибо plhn за предоставление этого приятного решения, которое я расширил ниже.

Если вы хотите только имена файлов, так что легко просто скопировать файлы, необходимые в чистом формате, вы можете использовать команду find.

предполагается, что dir1 и dir2 находятся в одной родительской папке. СЭД просто удаляет родительскую папку, чтобы вы могли сравнить яблоки с яблоками. Последний sed просто возвращает имя dir1.

Если вы просто хотите файлов:

аналогично для каталогов:

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

  • diff-r dir1 dir2: сравнить
  • grep ‘Only in’: получить строки, содержащие ‘Only in’
  • grep dir1: получить строки, содержащие dir

неудовлетворенный всеми ответами, так как большинство из них работают очень медленно и производят излишне длинный вывод для больших каталогов, я написал свой собственный скрипт Python для сравнения двух папок.

В отличие от многих других решений, он не сравнивает содержимое файлов. Также он не входит в подкаталоги, которые отсутствуют в другом каталоге. Таким образом, вывод довольно лаконичен, и скрипт работает быстро.

или если вы хотите видеть только файлы из первого каталога:

P. S. Если вам нужно сравнить размеры файлов и файлов хэши для потенциальных изменений, я опубликовал обновленный скрипт здесь: https://gist.github.com/amakukha/f489cbde2afd32817f8e866cf4abe779

упрощенный способ сравнения 2 каталогов с помощью команды DIFF

diff имя файла.1 именем.2 > имя_файла.dat > > Enter

открыть именем.dat после завершения запуска

и вы увидите: Только в имени файла.1: имя.Два Только в: directory_name: name_of_file1 Только в: directory_Name: name_of_file2

kdiff3 имеет приятный интерфейс diff для файлов и каталогов.

Он работает под Windows & Linux.

GNU grep может инвертировать поиск с помощью опции -v . Это делает grep отчет о строках, которые не совпадают. С помощью этого вы можете удалить файлы в dir2 из списка файлов в dir1 .

опции -F -x рассказать grep для выполнения строкового поиска по всей строке.

это скрипт bash для печати команд для синхронизации двух каталогов

Источник

Оцените статью