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 :
- J'ai créé les trois dossiers.
- J'ai créé plusieurs fichiers texte avec des contenus différents en ancien .
- J'ai copié les fichiers de l'ancien à nouveau .
- J'ai modifié le contenu de certains fichiers dans nouveau et ajouté quelques fichiers supplémentaires.
- 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()