Jak mogę porównać dwa katalogi z podkatalogami, aby zobaczyć, jaka jest różnica?
Jak mogę porównać dwa katalogi z podkatalogami, aby zobaczyć, jaka jest różnica?
Odpowiedzi:
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.
Użyłem meldu na Ubuntu - ma dobrą opcję porównywania katalogów.
Beyond Compare to dobre narzędzie komercyjne, około 30 USD. Działa pod oknami, ma wersję eval. http://www.scootersoftware.com/
Różnica jest zwykle używana do porównywania dwóch plików, ale może zrobić znacznie więcej. W diff
opcjach „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ć Rsync
i 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.
DiffMerge dla Windows pokazuje różnice, w tym podfoldery w oknie. Jest też gdzieś wersja przenośna, ale szybkie wyszukiwanie ujawniło to pobieranie: http://www.softpedia.com/get/System/File-Management/SourceGear-DiffMerge.shtml
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."} }