Como posso comparar dois diretórios com subdiretórios para ver onde está a diferença?
Como posso comparar dois diretórios com subdiretórios para ver onde está a diferença?
Respostas:
No Linux:
$ diff -r /first/directory /second/directory
No Windows: é melhor baixar e instalar o WinMerge e, em seguida,
> WinMerge /r c:\first\folder c:\second\folder
M
Eu usei o meld no Ubuntu - ele tem uma boa opção de comparação de diretórios.
O Beyond Compare é uma boa ferramenta comercial, cerca de US $ 30. Funciona sob janelas, tem uma versão eval. http://www.scootersoftware.com/
Diff é normalmente usado para comparar dois arquivos, mas pode fazer muito mais do que isso. Nas diff
opções "r" e "q", o trabalho é recursivo e silencioso, ou seja, apenas mencionando diferenças, que é exatamente o que estamos procurando:
diff -rq todo_orig/ todo_backup/
Se você também deseja ver diferenças nos arquivos que podem não existir nos dois diretórios:
diff -Nrq dir1/ dir2/
Você também pode usar Rsync
e find
. Para find
:
find $FOLDER -type f | cut -d/ -f2- | sort > /tmp/file_list_$FOLDER
Mas arquivos com os mesmos nomes e nas mesmas subpastas, mas com conteúdo diferente, não serão mostrados nas listas.
Se você é fã de GUI, pode verificar Meld . Funciona bem no Windows e no Linux.
O DiffMerge para Windows mostra diferenças, incluindo subpastas em uma janela. Há também uma versão portátil em algum lugar, mas uma pesquisa rápida revelou esse download: http://www.softpedia.com/get/System/File-Management/SourceGear-DiffMerge.shtml
Eu escrevi isso usando o cmdlet Compare-Objects no 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."} }