comparer contenu de dossiers

Ce n'est pas pratique avec PhotoMechanic qui permet de tout faire à la fois et en général je traite mes photos bien après le chargement de la carte
 
:coucou: soizic

Supposons que le dossier du volume de travail s'appelle A et le dossier du volume de sauvegarde B.

A (après ton filtrage) contient un sous-ensemble de fichiers par rapport à B qui comprend leur ensemble.

Ce que tu souhaites > ce n'est donc pas une "mise-à-jour incrémentale" qui ajouterait les différences excédentaires d'un dossier A à un autre B moins riche en éléments > mais inversement > une "réduction incrémentale" telle que : les fichiers identiques ne soient pas copiés de A en B (puisqu'ils sont déjà présents sur la destination) > mais telle que : les fichiers excédentaires de B (destination) sur A (source) soient supprimés > de sorte que B soit réduit à A.

Tu peux effectuer cette opération par les options de l'utilitaire rsync. Voici la commande type :
Bloc de code:
rsync -avu --del [PATH]A/ [PATH]B

Commentaire des options retenues :
  • a = archive --> récursivité + fidélité à tout ce qui importe comme propriétés des fichiers ou dossiers ;
  • v = verbose --> affichage en ligne à ligne de chaque élément traité en recopie ;
  • u = update --> échappement de recopie des fichiers identiques sur la destination par rapport à la source (principe d'économie) :
  • --del = abrégé de --delete-during --> supprimer incrémentalement tous les éléments de la destination non présents sur la source - ce au fur et à mesure de leur rencontre alphabétique (principe d'économie bis : c'est l'option destructrice la plus rapide).

Commentaire sur l'énoncé du dossier "source"  A:
  • rejeter absolument l'écriture de : A/* (soit : tous les éléments inclus dans le dossier A) > car ce choix neutraliserait ipso facto l'option --del (suppression des fichiers excédentaires de la destination) > en cantonnant la recopie à une mise-à-jour incrémentale ;
  • choisir résolument l'écriture de : A/ (soit : l'espace en-dessous du dossier source) > car ce choix est compatible avec l'option --del (suppression incrémentale des fichiers excédentaire de la destination) > tout en ne copiant pas le répertoire parent dans la destination.
 
Merci Macomaniac.
Je rentre justement d'une promenade avec mon bichon et mon APN, donc je passe immédiatement aux TP.
45 photos, 5 supprimées.
Le truc marche :

miniphot:~ soizic$ rsync -avu --del ~/A-Capture/2017-Apr-16-bois /Volumes/TRAVAIL/A-Capture/2017-Apr-16-bois
building file list ... done
created directory /Volumes/TRAVAIL/A-Capture/2017-Apr-16-bois
2017-Apr-16-bois/
2017-Apr-16-bois/L1020672.dng
2017-Apr-16-bois/L1020673.dng

2017-Apr-16-bois/L1020716.dng



sent 1791052197 bytes received 906 bytes 70237376.59 bytes/sec


total size is 1790831082 speedup is 1.00

mais il y a une erreur de chemin : il crée un nouveau B dans le B
résultat, il en retste bien 40 au liey de 45

upload_2017-4-16_17-49-18.png
 
Tu as passé la commande :
Bloc de code:
rsync -avu --del ~/A-Capture/2017-Apr-16-bois /Volumes/TRAVAIL/A-Capture/2017-Apr-16-bois

essaie avec la commande :
Bloc de code:
rsync -avu --del ~/A-Capture/2017-Apr-16-bois/ /Volumes/TRAVAIL/A-Capture/2017-Apr-16-bois

La différence concerne la mention du dossier de la source : au lieu de saisir -->
  • 2017-Apr-16-bois
termine l'intitulé par un / ainsi -->
  • 2017-Apr-16-bois/

=> dans mes essais > le répertoire parent (2017-Apr-16-bois chez toi) n'est pas copié dans le répertoire de destination > il n'y a que le contenu qui est pris en considération.
 
C'est super bon !

Je me demande si tu ne pourrais pas me simplifier encore plus la vie : mes dossiers s'appellent en fait plutôt :
"18 2017-Apr-16 bois" je suis donc obligée de mettre des guillemets et c'est dur de les répéter deux fois. Je verrai d'un bon œil une variante qui aurait le nom du fichier suivie de l'ordre :
rsync -avu --del ~/A-Capture/var/ /Volumes/TRAVAIL/A-Capture/var

Ma paresse t'inspire ? Mon Unix est si loin…

Merci
 
Pourquoi ne fais-tu pas des glisser-déposer directs du dossier source et du dossier destination  dans la fenêtre du «Terminal» aux endroits opportuns ? --> tu auras automatiquement le chemin absolu et l'intitulé avec les \ à leur place pour échapper les espaces libres dans les intitulés.

Tu commences par saisir :
Bloc de code:
rsync -avu --del
> tu sautes un espace > glisser-déposer du dossier source (ce qui va mettre les \ d'échappement des espaces libres à leur place) > tu reviens à coller le dernier caractère et tu saisis le / (pour ne pas copier le dossier parent) > saut d'un espace > glisser-déposer direct du dossier destination.

[Personnellement > j'ai tendance à faire toujours ainsi. C'est une combinaison du «Terminal» et du Finder. Je saisis à la main la commande > sauf les intitulés d'objets auxquels s'applique la commande > dès que la saisie (chemin et intitulé) commence à s'embroussailler.]
 
Merci à tous pour toutes vos réponses !!
Je viens seulement de les voir, pas reçu de notification...
Je recommence à avoir un peu de temps pour m'occuper de ce problème.
Je vais tester tout ça. Merci encore.
 
Salut Bompi,

Tout d'abord merci encore pour ton aide !

J'ai créé un fichier .sh avec tes indications mais j'ai un retour d'erreur:

MacBook-Pro-de-Thierry:Documents Thierry$ ./script1.sh

./script1.sh: line 3: syntax error near unexpected token `)'

./script1.sh: line 3: `find "/Volumes/DOCS/ A TRIER/De iphone Sandra a verifier/A classer Sandra" -type f -exec md5 -r {} +) | sort > liste_A'

MacBook-Pro-de-Thierry:Documents Thierry$

Faut-il que j'enlève la parenthèse ?

Je suis totalement néophyte, pardonne mes questions "bêtes"...

Liste A et B se créent tout seuls ? où ?

Merkiiii
 
Oups !! Comme quoi, on a beau vérifier...

Je viens de corriger mon post : j'avais laissé une parenthèse fermante dans les deux premières commandes, désolé.
Il devrait te suffire de supprimer cette parenthèse dans les commandes correspondantes de ton script.
 
Bonjour,

Il me reste juste un petit souci sur la fin...
La liste des fichiers manquants est bien générée, en voici un extrait:

0003b9cedc54726f62578dc59fb4024c /Volumes/DOCS/ A TRIER/De iphone Sandra a verifier/A classer Sandra/101APPLE/IMG_1957.JPG
00788e0f02e2b3acecb2c83994406f6e /Volumes/DOCS/ A TRIER/De iphone Sandra a verifier/A classer Sandra/102APPLE/IMG_2649.JPG
00c021f34a826aecd66efcff78a37248 /Volumes/DOCS/ A TRIER/De iphone Sandra a verifier/A classer Sandra/102APPLE/IMG_2726.JPG


Le souci c'est que la copie à partir de cette liste ne fonctionne pas. Mon dossier "différences" de destination reste vide.
le copie.sh est vide

J'ai essayé d'isoler la dernière partie avec:
cat /Users/Thierry/liste_manquants | xargs -I {} cp {} /Volumes/DOCS/ A TRIER/Différences

...mais toujours rien

Merci

Thierry
 
Dans les commandes que j'indique, il n'y a pas d'utilisation de xargs (qui est en général utilisé après find) ; j'utilise plutôt awk (post #18).

Et je viens d'essayer la commande indiquée en utilisant ton exemple et ça donne quelque chose d'honnête :
Bloc de code:
cat liste_manquants | cut -b 34- | awk '{print "cp \""$0"\" \"/chemin/pour/copie\""}' > copie.sh
donne :
Bloc de code:
cp "/Volumes/DOCS/ A TRIER/De iphone Sandra a verifier/A classer Sandra/101APPLE/IMG_1957.JPG" "/chemin/pour/copie"
cp "/Volumes/DOCS/ A TRIER/De iphone Sandra a verifier/A classer Sandra/102APPLE/IMG_2649.JPG" "/chemin/pour/copie"
cp "/Volumes/DOCS/ A TRIER/De iphone Sandra a verifier/A classer Sandra/102APPLE/IMG_2726.JPG" "/chemin/pour/copie"

Il suffit de bien remplacer la partie /chemin/pour/copie par le bon chemin.
 
Bingo ! ça marche !
494 fichiers ont été copiés dans mon dossier Différences. (sur les 60 000 initiaux)
Petit bémol, la date de création du fichier n'a pas été conservée, tout est à aujourd'hui...dur dur de les classer.
N'y aurait-il pas une petit lettre (-p ?) à rajouter à la commande copie pour l'exécuter en conservant les propriétés des fichiers ?

Merciiiii
 
Bingo ! ça marche !
494 fichiers ont été copiés dans mon dossier Différences. (sur les 60 000 initiaux)
Petit bémol, la date de création du fichier n'a pas été conservée, tout est à aujourd'hui...dur dur de les classer.
N'y aurait-il pas une petit lettre (-p ?) à rajouter à la commande copie pour l'exécuter en conservant les propriétés des fichiers ?

Merciiiii
Salut

Tu peux tenter en effet d'ajouter un -p à la commande cp.
 
Je me suis lancé,
C'était bien ça...

cat liste_manquants | cut -b 34- | awk '{print "cp -p \""$0"\" \"/Volumes/DOCS/ A TRIER/Différences\""}' > copie.sh

J'ai retrouvé les dates de création d'origine ! c'est nickel !

Toute dernière chose: le script de copie des fichiers est bien créé automatiquement dans copie.sh
mais comment lancer son exécution en fin de script ? (j'ai du le lancer séparément)
 
En faisant comme ceci, par exemple :
Bloc de code:
cat liste_manquants | cut -b 34- | awk '{print "cp -p \""$0"\" \"/Volumes/DOCS/ A TRIER/Différences\""}' | /bin/bash