Logiciel copie fichier par comparaison plus récent

micka260

Membre actif
14 Mai 2013
390
16
31
Bonjour,
J'ai deux dossiers contenant des fichiers "presque" identique, je suis a la recherche d'un logiciel capable de me faire une copie identique des 2 dossiers en conservant tout les fichiers et en gardant a chaque fois la version la plus récente des 2.

Exemple :
Dossier 1 contient les fichiers A; B et C
Dossier 2 contient les fichiers B; C; et D

Dans les 2 dossiers je veux : A; B; C; D et sur B et C un comparatif pour garder que le plus récent

Merci pour votre aide
 
Regarde ceci, je l'utilise pour synchroniser des dossiers sur des supports différents.
Et il devrait répondre très précisément à ton besoin.
 
  • J’aime
Réactions: micka260
Bonjour micka

Petite description d'une alternative en mode "texte" à l'usage "graphique" d'un logiciel comme celui préconisé par JLB :coucou: > ce qui aura peut-être un effet dissuasif hé ! hé !
361608_original.png


La commande rsync dans le «Terminal» fait ce que tu souhaites avec les options -avu (a comme archive, v comme verbose et u comme update).

rsync avec la seule option a copie les éléments d'une source qui diffèrent des éléments d'une destination > sans affecter les éléments de la destination soit autres soit identiques. Avec l'option u ajoutée > rsync copie les éléments de la source qui diffèrent des éléments de la destination > sans affecter les éléments autres > mais en mettant à jour les éléments identiques dont la date de modification est plus ancienne que celle des éléments identiques plus récents de la source. L'option v permet seulement l'affichage élément à élément des termes de la copie pendant qu'elle s'effectue (ce qui donne l'impression qu'il se passe quelque chose plutôt que rien).

En conséquence > une commande rsync -avu prenant les éléments du Dossier 1 comme source et le Dossier 2 comme destination > produirait un Dossier 2 mis à jour dont le contenu (en collant à ton exemple) initial B; C; D serait désormais A; B (le + récent); C (le + récent); D.

À partir de là, une commande rsync -avu prenant à son tour les éléments du Dossier 2 comme source et le Dossier 1 comme destination > produirait un clone de 2 dans 1 tel que les éléments initiaux de la destination: A; B; C deviendraient désormais A; B (le + récent); C (le + récent); D.

Si tu préférais que l'opération consiste en une synthèse des contenus des 2 dossiers 1 & 2 dans un 3è seul mis-à-jour complètement > alors une commande rsync -avu prendrait pour source les éléments du Dossier 1 et pour destination le Dossier 3 > puis une commande rsync -avu prendrait pour source les éléments du Dossier 2 et pour destination le Dossier 3 > de telle sorte que le contenu du Dossier 3 serait la somme des éléments des 2 dossiers, les éléments identiques mis à jour à leur état le plus récent.

--------------------​

Pour ce qui est de la technique de la commande > si je me donne l'exemple de 3 dossiers intitulés Dossier 1 > Dossier 2 > Dossier 3 tous les trois présents sur ton Bureau de session > alors la paire de commandes :
Bloc de code:
rsync -avu Desktop/"Dossier 1"/* Desktop/"Dossier 2"
rsync -avu Desktop/"Dossier 2/* Desktop/"Dossier 1"
produirait la synchronisation réciproque des contenus des 2 dossiers ; tandis que la paire de commandes :
Bloc de code:
rsync -avu Desktop/"Dossier 1"/* Desktop/"Dossier 3"
rsync -avu Desktop/"Dossier 2"/* Desktop/"Dossier 3"
produirait une synthèse à jour des contenus des 2 dossiers sources (1 & 2) non modifiés en eux-mêmes dans le dossier d'accueil Dossier 3 (supposé existant à l'état vide au départ).

3 remarques sont utiles à la compréhension logique de ces commandes de type "exemples" :

- j'écris Desktop en mode brut de décoffrage pour désigner l'espace du répertoire de ton Bureau de session > pour la raison suivante : lorsqu'on lance le «Terminal» de macOS > par défaut l'opérateur bénéficie d'un login automatique à la fois identitaire (le nom court de l'utilisateur dont la session est ouverte) et locatif (dans l'espace-racine de son dossier de compte). Si ton nom court d'utilisateur est micka > alors quand tu lances le «Terminal» > par défaut tu es automatiquement loggé en tant qu'user micka at: /Users/micka : l'espace-racine de ton dossier de compte. L'invite de commande est donc du type :
Bloc de code:
Nom-du-Mac:~ micka$
> le tilde ~ désignant en abrégé (chemin relatif) la même chose que /Users/micka (chemin absolu) = l'espace de ton dossier de compte > le micka$ suivant te désignant comme opérateur loggé à cet emplacement.

On en déduit que l'opérateur micka$, loggé par défaut at: ~ (= /Users/micka), espace de répertoire où se trouve directement présent le sous-dossier Desktop (= Bureau) > n'a qu'à saisir Desktop tout court dans la fenêtre du «Terminal» pour que ce soit compris comme ~/Desktop = /Users/micka/Desktop.

- j'écris le nom des dossiers entre "" ("Dossier 1", "Dossier 2", "Dossier 3") > uniquement parce que leur intitulé comporte un espace libre central. La mise entre "" a la propriété de faire échapper cet espace libre lors de l'exécution de la commande > ce qui fait que l'intitulé est traité comme d'un seul tenant.

Un autre procédé pour échapper un espace libre dans l'intitulé d'un seul objet est l'anti-slash \ > ce qui donnerait par exemple: Dossier\ 1 > mais je l'ai évité pour la raison qu'il est d'une saisie un peu moins évidente que les "".

- j'ai terminé la désignation des dossiers source chaque fois par un /* > qui équivaut à : "tous les éléments compris dans le dossier" > parce que rsync copie directement l'objet assigné en source dans le répertoire assigné en destination. Si j'avais mentionné comme source : "Dossier 1" en bloc > rsync aurait copié le Dossier 1 source à l'intérieur du Dossier 2 de destination > à côté des éléments déjà contenus dans Dossier 2.

Afin que rsync importe le seul contenu des éléments de la source, et pas le dossier parent de la source avec ses éléments > il faut donc faire suivre la désignation du dossier source (ex. "Dossier 1") de la désignation de ses éléments pris en totalité (/*) > ce qui donne : "Dossier 1"/*.
 
Dernière édition par un modérateur:
Salut macomaniac :up:

Si tu savais à quel point je suis frustré à chacune de tes interventions, de n'absolument rien connaître de tes immenses connaissances !
Et quelle jouissance ce doit être de pouvoir donner des ordres aux ordinateurs, de leur faire exécuter à peu près tout ce que l'on veux, vraiment je t'envie…:woot:
 
  • J’aime
Réactions: r e m y
Merci a vous deux pour vos réponses,
une plutôt simple, et une plutôt très technique :)
Je suis désolé macomaniac, mais la solution de JLB21 est juste beaucoup plus simple, et vue que je suis un gros fainéant, j'ai pris ce petit logiciel :p, par contre par curiosité je vais aussi essayé ta solution ;)
Cette enchainement de ligne de code est-t-il possible de l'enregistrer pour l'exécuter directement ? comme sur Windobe dans un .bat
 
Salut micka

Je te conseillerais de tester avec 2 dossiers expérimentaux (simples copies de dossiers originaux).

Le seul problème dans les commandes est la saisie des adresses, qui constitue la partie variable des commandes, le départ : rsync -avu constituant la partie constante.

Voici comment tu peux t'y prendre (avec tes dossiers expérimentaux) :

- tu commences seulement à écrire dans la fenêtre du «Terminal» :
Bloc de code:
rsync -avu
et tu sautes un espace avec la barre d'espacement du clavier.

- tu fais un glisser-déposer direct au pointeur de l'équivalent de ton Dossier 1 dans la fenêtre du «Terminal» > ce qui inscrit automatiquement le chemin au dossier et son intitulé terminal (avec échappement des espaces libres dans l'intitulé s'il y a lieu) - genre :
Bloc de code:
rsync -avu /[CHEMIN]/Dossier\ 1

- tout glisser-déposer dans une fenêtre du «Terminal» génère automatiquent un saut d'espace en sortie > avec la touche du clavier (en haut à droite) tu ramènes le pointeur de la fenêtre du «Terminal» à coller le dernier caractère du titre du dossier (le 1 dans mon exemple) et tu complètes en saisissant :
Bloc de code:
/*
pour désigner en source les fichiers contenus dans le dossier et pas le dossier contenant > ce qui te donne quelque chose comme :
Bloc de code:
rsync -avu /[CHEMIN]/Dossier\ 1/*
> et tu sautes alors manuellement un espace avec la barre d'espacement du clavier.

- tu fais alors un glisser-déposer direct au pointeur de l'équivalent de ton Dossier 2 dans la fenêtre du «Terminal» > ce qui inscrit automatiquement le chemin au dossier et son intitulé terminal (avec échappement des espaces libres dans l'intitulé s'il y a lieu) - genre :
Bloc de code:
rsync -avu /[CHEMIN/]Dossier\ 1/* /[CHEMIN]/Dossier\ 2

--> la commande est alors directement exécutable. Tu n'as plus qu'à répéter en inversant les dossiers. C'est longuet à décrire mais ultra-trivial à opérer quand on a pigé le truc.

Pour ce qui est d'une exécution automatique > elle supposerait que tu aies toujours les 2 mêmes dossiers aux mêmes adresses avec les mêmes intitulés > alors tu pourrais te créer une petite application AppleScript activable par double-clic > consistant en l'activation d'un fichier exécutable de type :
Bloc de code:
do shell script "rsync -avu /[CHEMIN]Dossier\ 1/* /[CHEMIN]/Dossier\ 2 ; rsync -avu /[CHEMIN]/Dossier\ 2/* /[CHEMIN]/Dossier\ 1"
(le ; entre les 2 lignes de commandes équivalant à un : "après l'exécution de la commande précédente > exécuter la commande conséquente").
 
Merci pour ces illustrations particulièrement claires et pédagogiques de l'utilisation de la commande rsync.

Si les noms des dossiers cible ou source ne comportent pas d'espace, mais comportent des accents, faut-il aussi utiliser les guillemets?

iDan
 
:coucou: iDan

Non : les guillemets droits "" (ou les anti-slashes \ ) ne servent qu'à échapper un ou des espaces internes à un intitulé > afin que la commande ne soit pas cassée. Ou encore des apostrophes.

À supposer un dossier intitulé : Intérêts > tu le désignes tel quel comme cible dans une commande du «Terminal». Suppose qu'il réside sur ton Bureau de session > et que tu veuilles en faire une copie dans le volume d'un DDE intitulé Data en utilisant cp > alors tu peux passer une commande simple :
Bloc de code:
cp -av Desktop/Intérêts /Volumes/Data

S'il était s'intitulé par contre : De l'intérêt d'être constant
361608_original.png
> alors la commande deviendrait :
Bloc de code:
cp -av Desktop/De\ l\'\intérêt\ d\'\être\ constant /Volumes/Data
où tu vois que l'emploi de guillemets droits :
Bloc de code:
cp -av Desktop/"De l'intérêt d'être constant" /Volumes/Data
est un vrai soulagement.

=> donc consigner tels quels les intitulés à un seul mot > utiliser les "" (de préférence aux \ ) pour les intitulés à espace libre ou apostrophe.