Як порівняти два каталоги (включаючи підкаталоги) за різницями?


14

Як я можу порівняти два каталоги з підручниками, щоб побачити, де різниця?


6
Операційна система, будь ласка.
Максим Мінімус

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

Відповіді:


20

Під Linux:

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

У Windows: ви, мабуть, краще завантажити та встановити WinMerge, тоді

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

М


3
Я зараз використовую diff -qrl ...
alexus

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

@Omtara, після запуску програми WinMerge виберіть «Файл - Відкрити». У відкритому діалоговому вікні позначте // Включити підпапки //. Якщо ви відкриєте WinMerge, вибравши дві папки в Провіднику Windows, налаштуйте інтеграцію Shell. Відкрити Правка - Параметри; перейдіть до категорії // Інтеграція оболонки та перевірте // Включити підпапки за замовчуванням //.
Р. Шреурс

2

Я використовував meld на Ubuntu - він має хороший варіант порівняння каталогів.


+1 для meld, як правило, мені подобаються параметри командного рядка, такі як diff, але можливість візуально бачити фактичні різні папки двох різних каталогів на перший погляд таким візуальним чином дуже корисно. І Ueld, і Ubuntu 18.04 як і інші, все ще добре працюють для всіх, хто виявить це в 2018 році. Звичайно, для Windows WinMerge - це чудовий варіант. Я чув, як Meld працює в Windows, але особисто ще не пробував цього.
Кен

1

Більше порівняння - хороший комерційний інструмент - 30 доларів або близько того. Працює під вікнами, має 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, ви можете перевірити Meld . Він чудово працює як в Windows, так і в Linux.



0

Я написав це, використовуючи командлет Порівняння об’єктів у 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.