Как я могу сравнить две директории с подкаталогами, чтобы увидеть, где разница?
Как я могу сравнить две директории с подкаталогами, чтобы увидеть, где разница?
Ответы:
Под Linux:
$ diff -r /first/directory /second/directory
Под Windows: вам лучше скачать и установить WinMerge, затем
> WinMerge /r c:\first\folder c:\second\folder
M
Я использовал meld на Ubuntu - у него есть хорошая опция сравнения каталогов.
Beyond Compare - хороший коммерческий инструмент, 30 долларов или около того. Работает под Windows, имеет версию eval. http://www.scootersoftware.com/
Diff обычно используется для сравнения двух файлов, но может сделать гораздо больше. В diff
опциях «r» и «q» он работает рекурсивно и незаметно, то есть упоминаются только различия, что мы и ищем:
diff -rq todo_orig/ todo_backup/
Если вы также хотите увидеть различия для файлов, которые могут не существовать ни в одном каталоге:
diff -Nrq dir1/ dir2/
Вы также можете использовать Rsync
и find
. Для find
:
find $FOLDER -type f | cut -d/ -f2- | sort > /tmp/file_list_$FOLDER
Но файлы с одинаковыми именами и в тех же подпапках, но с разным содержимым не будут отображаться в списках.
Если вы фанат GUI, вы можете проверить Мелд . Он отлично работает как в Windows, так и в Linux.
DiffMerge для Windows показывает различия, включая подпапки в окне. Где-то также есть портативная версия, но быстрый поиск показал эту загрузку: http://www.softpedia.com/get/System/File-Management/SourceGear-DiffMerge.shtml
Я написал это с помощью командлета Compare-Objects в 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."} }