¿Cómo comparar dos directorios (incluidos los subdirectorios) por diferencias?

14

¿Cómo puedo comparar dos directorios con subdirectorios para ver dónde está la diferencia?

alexus
fuente
66
Sistema operativo por favor.
Maximus Minimus
¿Desea saber si hay archivos diferentes entre los dos directorios o si el contenido de los archivos es diferente?
Matt Simmons

Respuestas:

20

Bajo Linux:

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

En Windows: probablemente sea mejor que descargues e instales WinMerge, luego

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

METRO

MariusPontmercy
fuente
3
Yo uso diff -qrl ahora ...
alexus
1
¿Hay una opción en la GUI para especificar el modificador / r sin usar el símbolo del sistema?
Omtara
@ Omtara, después de iniciar WinMerge, elija Archivo - Abrir. En el cuadro de diálogo abierto, marque // Incluir subcarpetas //. Si abre WinMerge seleccionando dos carpetas en el Explorador de Windows, configure la integración de Shell. Abrir Editar - Opciones; navegue a Categoría // Integración de Shell y marque // Incluir subcarpetas por defecto //.
R. Schreurs
2

Solía meld en Ubuntu, tiene una buena opción de comparación de directorios.

DNayak
fuente
+1 para meld, normalmente me gustan las opciones de línea de comandos como diff, pero es muy útil poder ver visualmente las diferentes carpetas de dos directorios diferentes de una manera visual. Tanto meld como diff todavía funcionan bien en Ubuntu 16.04 y Ubuntu 18.04 para cualquier persona que encuentre esto en 2018. Por supuesto, en Windows, WinMerge es una gran opción. He oído que Meld funciona en Windows, pero aún no lo he probado personalmente.
Ken
1

En Windows, creo que Windiff lo hace, sin embargo, Winmerge es mi herramienta de elección para este trabajo. Es de código abierto y hace un trabajo muy bueno al comparar dos conjuntos de árboles de directorios.

editar: oops, fue golpeado por Marius

Bryan
fuente
1

Diff se usa normalmente para comparar dos archivos, pero puede hacer mucho más que eso. En las diffopciones "r" y "q" hacen que funcione de manera recursiva y silenciosa, es decir, solo mencionando las diferencias, que es justo lo que estamos buscando:

diff -rq todo_orig/ todo_backup/

Si también desea ver diferencias para archivos que pueden no existir en ninguno de los directorios:

diff -Nrq dir1/ dir2/

Puede también usar Rsyncy find. Para find:

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

Pero los archivos con los mismos nombres y en las mismas subcarpetas, pero con contenido diferente, no se mostrarán en las listas.

Si eres fanático de la GUI, puedes verificar Meld . Funciona bien tanto en Windows como en Linux.

Fábio
fuente
0

Escribí esto usando el cmdlet Compare-Objects en 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
fuente