Jak porównać dwa katalogi (w tym podkatalogi) pod kątem różnic?

14

Jak mogę porównać dwa katalogi z podkatalogami, aby zobaczyć, jaka jest różnica?

Alexus
źródło
6
Proszę o system operacyjny.
Maximus Minimus
Czy chcesz wiedzieć, czy między dwoma katalogami są różne pliki, czy też zawartość tych plików jest inna?
Matt Simmons,

Odpowiedzi:

20

Pod Linuksem:

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

W systemie Windows: prawdopodobnie lepiej pobierz i zainstaluj WinMerge

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

M.

MariusPontmercy
źródło
3
Teraz używam diff -qrl ...
alexus
1
Czy w GUI jest dostępna opcja określająca przełącznik / r bez użycia wiersza polecenia?
Omtara,
@Omtara, po uruchomieniu WinMerge wybierz Plik - Otwórz. W otwartym oknie dialogowym zaznacz // Uwzględnij podfoldery //. Jeśli otworzysz WinMerge, wybierając dwa foldery w Eksploratorze Windows, skonfiguruj integrację Shell. Otwórz edycję - Opcje; przejdź do Kategoria // Integracja powłoki i zaznacz // Domyślnie włącz podfoldery //.
R. Schreurs
2

Użyłem meldu na Ubuntu - ma dobrą opcję porównywania katalogów.

DNayak
źródło
+1 dla meld, normalnie lubię opcje wiersza poleceń, takie jak diff, ale możliwość wizualnego zobaczenia różnych folderów dwóch różnych katalogów na pierwszy rzut oka w tak wizualny sposób jest bardzo przydatna. Zarówno meld, jak i diff nadal działają dobrze na Ubuntu 16.04 i Ubuntu 18.04 dla każdego, kto znajdzie to w 2018 roku. Oczywiście w systemie Windows WinMerge jest świetną opcją. Słyszałem, że Meld działa na systemie Windows, ale jeszcze go osobiście nie wypróbowałem.
Ken
1

W systemie Windows wydaje mi się, że windiff to robi, jednak Winmerge jest moim ulubionym narzędziem do tego zadania. Jest to oprogramowanie typu open source i bardzo porządnie porównuje dwa zestawy drzew katalogów.

edytuj: ups, został pobity przez Mariusa

Bryan
źródło
1

Różnica jest zwykle używana do porównywania dwóch plików, ale może zrobić znacznie więcej. W diffopcjach „r” i „q” sprawiają, że działa rekurencyjnie i cicho, tzn. Tylko wspomina o różnicach, a tego właśnie szukamy:

diff -rq todo_orig/ todo_backup/

Jeśli chcesz zobaczyć różnice w plikach, które mogą nie istnieć w żadnym z katalogów:

diff -Nrq dir1/ dir2/

Możesz także użyć Rsynci find. Dla find:

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

Ale pliki o tych samych nazwach i w tych samych podfolderach, ale o innej zawartości, nie będą wyświetlane na listach.

Jeśli jesteś fanem GUI, możesz sprawdzić Meld . Działa dobrze zarówno w systemie Windows, jak i Linux.

Fábio
źródło
0

Napisałem to za pomocą polecenia cmdlet Compare-Objects w programie 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."} }
Davidw
źródło