Назад | Перейти на главную страницу

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

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

Под Linux:

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

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

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

M

я использовал объединить на Ubuntu - есть хороший вариант сравнения каталогов.

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

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

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

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

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

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

DiffMerge для Windows показывает различия, включая подпапки в окне. Также где-то есть портативная версия, но быстрый поиск показал эту загрузку: http://www.softpedia.com/get/System/File-Management/SourceGear-DiffMerge.shtml

Я написал это с помощью командлета 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."} }