Linux compare files in folder

Diff files present in two different directories

I have two directories with the same list of files. I need to compare all the files present in both the directories using the diff command. Is there a simple command line option to do it, or do I have to write a shell script to get the file listing and then iterate through them?

9 Answers 9

You can use the diff command for that:

This will output a recursive diff that ignore spaces, with a unified context:

  • b flag means ignoring whitespace
  • u flag means a unified context (3 lines before and after)
  • r flag means recursive

I have also found that —brief option is useful; you get a list of changed files and can process them separately

-urb would also be easy to remember for urban people. Too bad I live in the countryside. I think I’ll use -bru («bru» means «daughter in law», in French).

If you are only interested to see the files that differ, you may use:

diff -qr dir_one dir_two | sort 

Option «q» will only show the files that differ but not the content that differ, and «sort» will arrange the output alphabetically.

It is great! Also works efficiently — i.e. if a whole sub-directory exist only in one of the dirs, its stops recurring into it and reports only the sub-directory itself (without it successor contents). very nice!!

This is a really good first step: see what, if anything, does differ, and then do a detailed diff on each pair of differing files. One’s approach would be wildly different if only one or two files differed versus if dozens of files differed. I could get lost in the output from diff ing dozens of files at once!

Also, can include -x PATTERN in command to exclude certain subdirectories. For example, diff -qr repo1 repo2 -x «.git» will compare two directories (repo1 and repo2) but will exclude files in .git folder of respective directories.

Diff has an option -r which is meant to do just that.

diff can not only compare two files, it can, by using the -r option, walk entire directory trees, recursively checking differences between subdirectories and files that occur at comparable points in each tree.

$ man diff . -r --recursive Recursively compare any subdirectories found. . 

Another nice option is the über-diff-tool diffoscope:

It can also emit diffs as JSON, html, markdown, .

If you specifically don’t want to compare contents of files and only check which one are not present in both of the directories, you can compare lists of files, generated by another command.

-printf ‘%P\n’ tells find to not prefix output paths with the root directory.

I’ve also added sort to make sure the order of files will be the same in both calls of find .

Читайте также:  Usb virtualbox linux ubuntu

The grep at the end removes information about identical input lines.

If it’s GNU diff then you should just be able to point it at the two directories and use the -r option.

for i in $(\ls -d ./dir1/*); do diff $ dir2; done 

N.B. As pointed out by Dennis in the comments section, you don’t actually need to do the command substitution on the ls. I’ve been doing this for so long that I’m pretty much doing this on autopilot and substituting the command I need to get my list of files for comparison.

Also I forgot to add that I do ‘\ls’ to temporarily disable my alias of ls to GNU ls so that I lose the colour formatting info from the listing returned by GNU ls.

Источник

How to Find Difference Between Two Directories Using Diff and Meld Tools

In an earlier article, we reviewed 9 best file comparison and difference (Diff) tools for Linux and in this article, we will describe how to find the difference between two directories in Linux.

Normally, to compare two files in Linux, we use the diff – a simple and original Unix command-line tool that shows you the difference between two computer files; compares files line by line and it is easy to use, comes with pre-installed on most if not all Linux distributions.

The question is how do we get the difference between two directories in Linux? Here, we want to know what files/subdirectories are common in the two directories, those that are present in one directory but not in the other.

The conventional syntax for running diff is as follows:

$ diff [OPTION]… FILES $ diff options dir1 dir2

By default, its output is ordered alphabetically by file/subdirectory name as shown in the screenshot below. In this command, the -q switch tells diff to report only when files differ.

$ diff -q directory-1/ directory-2/

Difference Between Two Directories

Again diff doesn’t go into the subdirectories, but we can use the -r switch to read the subdirectories as well like this.

$ diff -qr directory-1/ directory-2/

Using Meld Visual Diff and Merge Tool

There is a cool graphical option called meld (a visual diff and merge tool for the GNOME Desktop) for those who enjoy using the mouse, you can install it as follows.

$ sudo apt install meld [Debian/Ubuntu systems] $ sudo yum install meld [RHEL/CentOS systems] $ sudo dnf install meld [Fedora 22+]

Once you have installed it, search for “meld” in the Ubuntu Dash or Linux Mint Menu, in Activities Overview in Fedora or CentOS desktop and launch it.

You will see the Meld interface below, where you can choose file or directory comparison as well as version control view. Click on directory comparison and move to the next interface.

Meld Comparison Tool

Select the directories you want to compare, note that you can add a third directory by checking the option “3-way Comparison”.

Select Comparison Directories

Once you selected the directories, click on “Compare”.

Listing Difference Between Directories

In this article, we described how to find the difference between two directories in Linux. If you know any other commandline or gui way don’t forget to share your thoughts to this article via the comment section below.

Читайте также:  От чего помогает линукс

Источник

Сравнение файлов в Linux

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

В этой статье мы рассмотрим как выполняется сравнение файлов Linux. Разберем самые полезные способы, как для терминала, так и в графическом режиме. Сначала рассмотрим как выполнять сравнение файла linux с помощью утилиты diff.

Сравнение файлов diff

Утилита diff linux — это программа, которая работает в консольном режиме. Ее синтаксис очень прост. Вызовите утилиту, передайте нужные файлы, а также задайте опции, если это необходимо:

$ diff опции файл1 файл2

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

  • -q — выводить только отличия файлов;
  • -s — выводить только совпадающие части;
  • — выводить нужное количество строк после совпадений;
  • -u — выводить только нужное количество строк после отличий;
  • -y — выводить в две колонки;
  • -e — вывод в формате ed скрипта;
  • -n — вывод в формате RCS;
  • -a — сравнивать файлы как текстовые, даже если они не текстовые;
  • -t — заменить табуляции на пробелы в выводе;
  • -l — разделить на страницы и добавить поддержку листания;
  • -r — рекурсивное сравнение папок;
  • -i — игнорировать регистр;
  • -E — игнорировать изменения в табуляциях;
  • -Z — не учитывать пробелы в конце строки;
  • -b — не учитывать пробелы;
  • -B — не учитывать пустые строки.

Это были основные опции утилиты, теперь давайте рассмотрим как сравнить файлы Linux. В выводе утилиты кроме, непосредственно, отображения изменений, выводит строку в которой указывается в какой строчке и что было сделано. Для этого используются такие символы:

К тому же, линии, которые отличаются, будут обозначаться символом .

Вот содержимое наших тестовых файлов:

Теперь давайте выполним сравнение файлов diff:

В результате мы получим строчку: 2,3c2,4. Она означает, что строки 2 и 3 были изменены. Вы можете использовать опции для игнорирования регистра:

Можно сделать вывод в две колонки:

А с помощью опции -u вы можете создать патч, который потом может быть наложен на такой же файл другим пользователем:

Чтобы обработать несколько файлов в папке удобно использовать опцию -r:

Для удобства, вы можете перенаправить вывод утилиты сразу в файл:

diff -u file1 file2 > file.patch

Как видите, все очень просто. Но не очень удобно. Более приятно использовать графические инструменты.

Сравнение файлов Linux с помощью GUI

Существует несколько отличных инструментов для сравнения файлов в linux в графическом интерфейсе. Вы без труда разберетесь как их использовать. Давайте рассмотрим несколько из них:

1. Kompare

Kompare — это графическая утилита для работы с diff, которая позволяет находить отличия в файлах, а также объединять их. Написана на Qt и рассчитана в первую очередь на KDE. Кроме сравнения файлов утилита поддерживает сравнение каталогов и позволяет создавать и применять патчи к файлам.

Читайте также:  Linux очистить очередь печати принтера

2. Meld

Это легкий инструмент для сравнения и объединения файлов. Он позволяет сравнивать файлы, каталоги, а также выполнять функции системы контроля версий. Программа создана для разработчиков и позволяет сравнивать до трёх файлов. Можно сравнивать каталоги и автоматически объединять сравниваемые файлы. Кроме того поддерживаются такие системы контроля версий, как Git.

3. Diffuse

Diffuse — еще один популярный и достаточно простой инструмент для сравнения и слияния файлов. Он написан на Python 2. Поэтому в современных версиях Ubuntu программу будет сложно установить. Поддерживается две основные возможности — сравнение файлов и управление версиями. Вы можете редактировать файлы прямо во время просмотра.

4. KDiff3

KDiff3 — еще один отличный, свободный инструмент для сравнения файлов в окружении рабочего стола KDE. Он входит в набор программ KDevelop и работает на всех платформах, включая Windows и MacOS. Можно выполнить сравнение до трех файлов Linux или даже сравнить каталоги. Кроме того, есть поддержка слияния и ручного выравнивания.

5. TkDiff

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

Выводы

В этой статье мы рассмотрели как выполняется сравнение файлов linux с помощью терминала, как создавать патчи, а также сделали небольшой обзор лучших графических утилит для сравнения файлов. А какие инструменты для сравнения используете вы? Напишите в комментариях!

Обнаружили ошибку в тексте? Сообщите мне об этом. Выделите текст с ошибкой и нажмите Ctrl+Enter.

Источник

Compare files in two different directories in Linux

Use the diff command. Using the -r flag you can compare folders recursively:

The output will be in a format which the patch command understands. You can save it in a file and apply those changes to dir1 using

diff -ur dir1 dir2 > my.patch cd dir1 patch -p1 < ../my.patch 

#!/bin/bash diff -ur /tmp/testr/adir1 /tmp/test/adir2 >my.patch cd /tmp/anwar/adir1 patch -p1

I am more interested in seeing those files where mis-match found ( file size or if there count differences as well)

The output from diff can be changed and formatted. You need to go through man diff and play around with those options.

If you deal with text files and want to just see the differences, I would customize the diff output, as hek2mgl suggested. But if you want more control, for example to execute some commands after finding different files or you must compare binary files, you may utilize find and cmp .
Below is the sample, which you may customize:

#!/bin/bash IFS_SAVE="$IFS" IFS=$'\x0a' for f in $(find dir1 -type f -printf "%f\n"); do < f1="dir1/$f" f2="dir2/$f" cmp --quiet "$f1" "$f2" check=$? if [ $check -eq 0 ] ; then echo -e "OK: $f" elif [ $check -eq 1 ] ; then echo -en "Mismatch FOUND in files: " filesize1=$(stat --printf="%s" "$f1" ) filesize2=$(stat --printf="%s" "$f2" ) echo "$f1" size:"$filesize1" "$f2" size:"$filesize2" check:"$check" #you may put diff . or anything else here else echo "cannot compare files, probably $f2 is missing" fi >; done IFS="$IFS_SAVE" 

Depending on your situation (if filenames do not contain spaces, there are no missing files, etc.) you may omit some parts - this was just tailored from a larger script.

Источник

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