Comment comparer deux répertoires (y compris les sous-répertoires) pour les différences?

14

Comment puis-je comparer deux répertoires avec des sous-répertoires pour voir où est la différence?

alexus
la source
6
Système d'exploitation s'il vous plaît.
Maximus Minimus
Voulez-vous savoir s'il existe des fichiers différents entre les deux répertoires ou si le contenu des fichiers est différent?
Matt Simmons

Réponses:

20

Sous Linux:

$ diff -r /first/directory /second/directory

Sous Windows: vous feriez probablement mieux de télécharger et d'installer WinMerge, puis

> WinMerge /r c:\first\folder c:\second\folder

M

MariusPontmercy
la source
3
J'utilise diff -qrl maintenant ...
alexus
1
Existe-t-il une option dans l'interface graphique pour spécifier le commutateur / r sans utiliser l'invite de commande?
Omtara
@Omtara, après avoir démarré WinMerge, choisissez Fichier - Ouvrir. Dans la boîte de dialogue ouverte, cochez // Inclure les sous-dossiers //. Si vous ouvrez WinMerge en sélectionnant deux dossiers dans l'Explorateur Windows, configurez l'intégration Shell. Ouvrez Edition - Options; accédez à Category // Shell Integration et cochez // Inclure les sous-dossiers par défaut //.
R. Schreurs
2

J'ai utilisé meld sur Ubuntu - il a une bonne option de comparaison de répertoires.

DNayak
la source
+1 pour meld, normalement j'aime les options de ligne de commande comme diff mais être capable de voir visuellement les différents dossiers de deux répertoires différents en un coup d'œil d'une manière aussi visuelle est très utile. La fusion et la différence fonctionnent toujours très bien sur Ubuntu 16.04 et Ubuntu 18.04 pour quiconque le trouve en 2018. Bien sûr, sous Windows, WinMerge est une excellente option. J'ai entendu Meld fonctionner sur Windows mais je ne l'ai pas encore essayé personnellement.
Ken
1

Sur Windows, je crois que Windiff le fait, mais Winmerge est mon outil de choix pour ce travail. C'est open source et fait un travail très soigné de comparer deux ensembles d'arborescences de répertoires.

edit: oups, a été battu par Marius

Bryan
la source
1

Diff est normalement utilisé pour comparer deux fichiers, mais peut faire bien plus que cela. Dans les diffoptions "r" et "q", il fonctionne de manière récursive et silencieuse, c'est-à-dire en ne mentionnant que les différences, c'est exactement ce que nous recherchons:

diff -rq todo_orig/ todo_backup/

Si vous souhaitez également voir les différences pour les fichiers qui peuvent ne pas exister dans l'un ou l'autre répertoire:

diff -Nrq dir1/ dir2/

Vous pouvez également utiliser Rsyncet find. Pour find:

find $FOLDER -type f | cut -d/ -f2- | sort > /tmp/file_list_$FOLDER

Mais les fichiers portant les mêmes noms et dans les mêmes sous-dossiers, mais avec un contenu différent, ne seront pas affichés dans les listes.

Si vous êtes un fan de GUI, vous pouvez vérifier Meld . Cela fonctionne très bien sous Windows et Linux.

Fábio
la source
0

J'ai écrit ceci en utilisant l'applet de commande Compare-Objects dans 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."} }
Davidw
la source