GNU/Linux >> Tutoriels Linux >  >> Linux

Comment comparer deux dossiers et copier la différence dans un troisième dossier ?

Vous avez trois dossiers :

  • dossier actuel , qui contient vos fichiers actuels
  • dossier ancien , qui contient une ancienne version des mêmes fichiers
  • dossier différence , qui est juste un dossier vide

Comment comparez-vous ancien avec courant et copiez les fichiers qui sont différents (ou entièrement nouveaux) dans actuel à la différence ?

J'ai cherché partout et cela semble être une chose simple à aborder, mais je n'arrive pas à le faire fonctionner dans mon exemple particulier. La plupart des sources ont suggéré l'utilisation de rsync donc je me suis retrouvé avec la commande suivante :

rsync -ac --compare-dest=../old/ new/ difference/

Cependant, cela copie tous les fichiers de nouveau à la différence , même ceux qui sont les mêmes que dans ancien .

Au cas où cela aiderait (peut-être que la commande est correcte et que le problème se situe ailleurs), voici comment j'ai testé ceci :

  1. J'ai créé les trois dossiers.
  2. J'ai créé plusieurs fichiers texte avec des contenus différents en ancien .
  3. J'ai copié les fichiers de l'ancien à nouveau .
  4. J'ai modifié le contenu de certains fichiers dans nouveau et ajouté quelques fichiers supplémentaires.
  5. J'ai exécuté la commande ci-dessus et vérifié les résultats en différence .

Je cherchais une solution depuis quelques jours et j'apprécierais vraiment de l'aide. Il ne doit pas nécessairement utiliser rsync, mais j'aimerais savoir ce que je fais de mal si possible.

Réponse acceptée :

Je ne sais pas si vous pouvez le faire avec des commandes Linux existantes telles que rsync ou diff. Mais dans mon cas, j'ai dû écrire mon propre script en utilisant Python, car python a le module "filecmp" pour la comparaison de fichiers. J'ai posté tout le script et son utilisation sur mon site personnel - http://linuxfreelancer.com/

Son utilisation est simple - donnez-lui le chemin absolu du nouveau répertoire, de l'ancien répertoire et du répertoire de différence dans cet ordre.

#!/usr/bin/env python

import os, sys
import filecmp
import re
from distutils import dir_util
import shutil

holderlist = []


def compareme(dir1, dir2):
    dircomp = filecmp.dircmp(dir1, dir2)
    only_in_one = dircomp.left_only
    diff_in_one = dircomp.diff_files
    dirpath = os.path.abspath(dir1)
    [holderlist.append(os.path.abspath(os.path.join(dir1, x))) for x in only_in_one]
    [holderlist.append(os.path.abspath(os.path.join(dir1, x))) for x in diff_in_one]
    if len(dircomp.common_dirs) > 0:
        for item in dircomp.common_dirs:
            compareme(
                os.path.abspath(os.path.join(dir1, item)),
                os.path.abspath(os.path.join(dir2, item)),
            )
        return holderlist


def main():
    if len(sys.argv) > 3:
        dir1 = sys.argv[1]
        dir2 = sys.argv[2]
        dir3 = sys.argv[3]
    else:
        print "Usage: ", sys.argv[0], "currentdir olddir difference"
        sys.exit(1)

    if not dir3.endswith("/"):
        dir3 = dir3 + "/"

    source_files = compareme(dir1, dir2)
    dir1 = os.path.abspath(dir1)
    dir3 = os.path.abspath(dir3)
    destination_files = []
    new_dirs_create = []
    for item in source_files:
        destination_files.append(re.sub(dir1, dir3, item))
    for item in destination_files:
        new_dirs_create.append(os.path.split(item)[0])
    for mydir in set(new_dirs_create):
        if not os.path.exists(mydir):
            os.makedirs(mydir)
    # copy pair
    copy_pair = zip(source_files, destination_files)
    for item in copy_pair:
        if os.path.isfile(item[0]):
            shutil.copyfile(item[0], item[1])


if __name__ == "__main__":
    main()

Linux
  1. Linux - Comment synchroniser deux dossiers avec des outils de ligne de commande ?

  2. Problème de script bash - Comparez deux listes et créez-en une troisième ?

  3. Comment copier le chemin du répertoire actuel dans Ubuntu 18.04 ?

  4. Comment déplacer des fichiers et des répertoires vers le dossier parent sous Linux ?

  5. Comment puis-je copier un dossier à partir de la ligne de commande Linux ?

Comment sauvegarder des fichiers et des dossiers dans Debian 10

Comment voir les fichiers et dossiers cachés dans Debian

Comment compresser des fichiers et des dossiers sous Linux [Astuce pour débutant]

Comment compresser un dossier sous Linux

Comment créer de nouveaux dossiers dans le gestionnaire de fichiers ?

Comment compresser des fichiers et des dossiers sous Linux