Как сравнить два каталога (включая подкаталоги) на предмет различий?


14

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


6
Операционная система, пожалуйста.
Максимус Минимус

Вы хотите знать, существуют ли разные файлы между двумя каталогами или содержимое файлов отличается?
Мэтт Симмонс

Ответы:


20

Под Linux:

$ diff -r /first/directory /second/directory

Под Windows: вам лучше скачать и установить WinMerge, затем

> WinMerge /r c:\first\folder c:\second\folder

M


3
Сейчас я использую diff -qrl ...
alexus

1
Есть ли опция в графическом интерфейсе для указания параметра / r без использования командной строки?
Омтара

@Omtara, после того, как вы запустили WinMerge, выберите File - Open. В открывшемся диалоговом окне установите флажок // Включить подпапки //. Если вы откроете WinMerge, выбрав в Windows Explorer две папки, настройте интеграцию с Shell. Открыть Редактировать - Настройки; перейдите к Категории // Интеграция оболочки и отметьте // Включить подпапки по умолчанию //.
Р. Шреурс

2

Я использовал meld на Ubuntu - у него есть хорошая опция сравнения каталогов.


+1 для слияния, обычно мне нравятся параметры командной строки, такие как diff, но возможность визуально видеть фактические разные папки двух разных каталогов с такой наглядностью очень полезно. И meld, и diff все еще отлично работают на Ubuntu 16.04 и Ubuntu 18.04 для всех, кто найдет это в 2018 году. Конечно, для Windows WinMerge - отличный вариант. Я слышал, что Мелд работает на Windows, но лично я еще не пробовал.
Кен

1

Beyond Compare - хороший коммерческий инструмент, 30 долларов или около того. Работает под Windows, имеет версию eval. http://www.scootersoftware.com/


1

В Windows я верю, что это делает windiff, однако Winmerge - мой инструмент выбора для этой работы. Это открытый исходный код, и он очень аккуратно сравнивает два набора деревьев каталогов.

редактировать: ой, был избит Мариусом


1

Diff обычно используется для сравнения двух файлов, но может сделать гораздо больше. В diffопциях «r» и «q» он работает рекурсивно и незаметно, то есть упоминаются только различия, что мы и ищем:

diff -rq todo_orig/ todo_backup/

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

diff -Nrq dir1/ dir2/

Вы также можете использовать Rsyncи find. Для find:

find $FOLDER -type f | cut -d/ -f2- | sort > /tmp/file_list_$FOLDER

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

Если вы фанат GUI, вы можете проверить Мелд . Он отлично работает как в Windows, так и в Linux.



0

Я написал это с помощью командлета Compare-Objects в Powershell:

#set the directories 
$firstdirectory = Read-Host "What is the first directory you wish to compare?" $seconddirectory = Read-Host "What is the second directory you wish to compare?"

#Check if the user wants to compare subdirectories 
$recursivesearch = Read-Host "Do you wish to compare subdirectories? Please enter yes or no." If ($recursivesearch -eq "yes") 

#get the contents 
{ $firstdirectorycontents = @(Get-ChildItem $firstdirectory -Recurse) $seconddirectorycontents = @(Get-ChildItem $seconddirectory -Recurse ) }

    else { $firstdirectorycontents = @(Get-ChildItem $firstdirectory) $seconddirectorycontents = @(Get-ChildItem $seconddirectory) }
    #compare the objects and handle errors 
if ($firstdirectorycontents.Count -eq 0 )
        {
        Write-Host "No files were found in the first directory, the directories cannot be compared."
        }
        elseif ($seconddirectorycontents.Count -eq 0)
        {
        Write-Host "No files were found in the second directory, the directories cannot be compared."
        }
        else
        {   
        try 
            {
            Compare-Object -ReferenceObject $firstdirectorycontents -DifferenceObject $seconddirectorycontents 
            }

        catch {"Another error occured."} }
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.