¿Cómo puedo comparar dos directorios con subdirectorios para ver dónde está la diferencia?
¿Cómo puedo comparar dos directorios con subdirectorios para ver dónde está la diferencia?
Respuestas:
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
Solía meld en Ubuntu, tiene una buena opción de comparación de directorios.
Beyond Compare es una buena herramienta comercial, $ 30 más o menos. Se ejecuta bajo Windows, tiene una versión eval. http://www.scootersoftware.com/
Diff se usa normalmente para comparar dos archivos, pero puede hacer mucho más que eso. En las diff
opciones "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 Rsync
y 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.
DiffMerge para Windows muestra diferencias, incluidas las subcarpetas en una ventana. También hay una versión portátil en alguna parte, pero una búsqueda rápida reveló esta descarga: http://www.softpedia.com/get/System/File-Management/SourceGear-DiffMerge.shtml
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."} }