Come posso confrontare due directory con le directory secondarie per vedere dov'è la differenza?
Come posso confrontare due directory con le directory secondarie per vedere dov'è la differenza?
Risposte:
Sotto Linux:
$ diff -r /first/directory /second/directory
Sotto Windows: probabilmente faresti meglio a scaricare e installare WinMerge
> WinMerge /r c:\first\folder c:\second\folder
M
Ho usato la fusione su Ubuntu - ha una buona opzione di confronto delle directory.
Beyond Compare è un buon strumento commerciale, circa $ 30. Funziona sotto Windows, ha una versione di valutazione. http://www.scootersoftware.com/
Diff viene normalmente utilizzato per confrontare due file, ma può fare molto di più. Nelle diff
opzioni "r" e "q" lo fanno funzionare in modo ricorsivo e silenzioso, cioè menzionando solo le differenze, che è proprio quello che stiamo cercando:
diff -rq todo_orig/ todo_backup/
Se vuoi anche vedere le differenze per i file che potrebbero non esistere in entrambe le directory:
diff -Nrq dir1/ dir2/
Puoi anche usare Rsync
e find
. Per find
:
find $FOLDER -type f | cut -d/ -f2- | sort > /tmp/file_list_$FOLDER
Ma i file con gli stessi nomi e nelle stesse sottocartelle, ma con contenuti diversi, non verranno visualizzati negli elenchi.
Se sei un fan della GUI, puoi selezionare Combina . Funziona bene su Windows e Linux.
DiffMerge per Windows mostra differenze tra cui sottocartelle in una finestra. Esiste anche una versione portatile da qualche parte ma una rapida ricerca ha rivelato questo download: http://www.softpedia.com/get/System/File-Management/SourceGear-DiffMerge.shtml
L'ho scritto usando il cmdlet Compare-Objects in 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."} }