IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Shell et commandes GNU Discussion :

Comparaison de deux dossiers et copie de modifications dans un troisième


Sujet :

Shell et commandes GNU

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2012
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2012
    Messages : 14
    Points : 9
    Points
    9
    Par défaut Comparaison de deux dossiers et copie de modifications dans un troisième
    Bonjour,
    J'ai trois dossiers:
    /home/u/a_sauver
    /home/u/sauvegarde
    /home/u/s_dif
    Actuellement, à l'aide de la commande rsync, j'ai fait une première sauvegarde de la totalité du répertoire "a_sauver" dans "sauvegarde"
    Puis, une fois par mois, je ne sauvegarde que les modifications: Parfait.

    Je voudrais faire un script ou bien trouver une commande qui me permette de:
    prendre tous les fichiers et dossiers de "a_sauver"
    les comparer à ce qu'on va trouver dans "sauvegarde"
    et de copier UNIQUEMENT les fichiers et dossiers différents dans "s_dif"

    J'ai tenté avec rsync (option --link-dest) mais étant donné que ces repertoires sont des points de montage vers Windows, j'ai dans "s_dif" tous les fichiers et non pas les liens.
    http://blog.alexou.net/backup-incremental-avec-rsync
    Peut-être avec diff ou find ?
    Ou bien ceci (mais comment faire la récursion):
    http://www.developpez.net/forums/d94...es-sous-linux/

    Auriez-vous une solution ?
    Merci.

  2. #2
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 538
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 538
    Points : 19 360
    Points
    19 360
    Par défaut
    Bonjour,

    comment faire la récursion ?
    toujours en bash :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    usr=~u
    rep1="$usr/a_sauver"
    rep2="$usr/sauvegarde"
    rep3="$usr/s_dif"
    shopt -s nullglob globstar
    for f in "$rep1"/**/*; do if [ -f "$f" -a ! -f "$rep2/${f#$usr/*/}" ]; then echo cp "$f" "$rep3/${f#$usr/*/}"; fi; done
    ce n'est pas testé; il faudra peut-être "ajuster".
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2012
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2012
    Messages : 14
    Points : 9
    Points
    9
    Par défaut
    Merci de votre réponse.
    Je vais alors essayer de partir de cette base,
    mais si je ne m'abuse, le test (if) ne prends pas en compte les fichiers modifiés.
    Seulement les fichiers non présents sont copiés.

    Quel test puis je faire pour copier également les fichiers modifiés (plus récents) ?
    Avec un diff peut-être ?

  4. #4
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 538
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 538
    Points : 19 360
    Points
    19 360
    Par défaut
    stat permet d'afficher (entre autre) la date de dernière modification dans un format facilement comparable (nombre de secondes depuis EPOCH).
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2012
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2012
    Messages : 14
    Points : 9
    Points
    9
    Par défaut
    Bonjour,
    Avec un script à base de find, while, mkdir -p et cp,
    j'ai pu arriver à peu près à ce que je voulais.
    Je ne vous met pas le script exact ici (trop honte du bidouillage), mais seulement le raisonnement:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    find /home/u/rep1 -type f|while read source
    do
       #si source n'est pas dans rep2
          #on construit l'arborescence (mkdir -p) dans s_dif
          #on copie source dans s_dif (cp)
       #sinon
          #si source n'a pas la meme taille que dans rep2
          #on construit l'arborescence (mkdir -p) dans s_dif
          #on copie source dans s_dif (cp)
       #fin si
    done
    Si vous avez d'autres idées, ou commandes, ou remarques, pour simplifier ou fiabiliser le script je suis preneur.
    Merci Encore.

  6. #6
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 266
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 266
    Points : 12 681
    Points
    12 681
    Par défaut
    Bonjour,

    Si tu compares la taille des fichiers pour savoir s'ils ont été modifiés, ce n'est pas terrible (a part si tu es sur que c'est le seul cas possible, comme par exemple des logs qui ne font que se remplir).
    Sinon, le mieux pour voir si un fichier a été modifié réellement, c'est de faire un cksum ou md5sum.

    un petit détail aussi concernant find, il possède des options d'affichage (-printf "...." ) qui peuvent simplifier le reste du code, comme par exemple afficher juste le nom du fichier sans son arborescence, la taille du fichier, la date de dernière modification,etc...
    Cordialement.

Discussions similaires

  1. [XL-2003] Comparer deux feuilles et insérer les occurences dans une troisième
    Par Newbie_vba dans le forum Macros et VBA Excel
    Réponses: 12
    Dernier message: 03/09/2011, 12h55
  2. Réponses: 6
    Dernier message: 28/05/2010, 15h33
  3. PL/SQL COMPARAISON DE DEUX TABLEAUX APRES BULK
    Par mimi_été dans le forum PL/SQL
    Réponses: 5
    Dernier message: 30/06/2009, 13h14
  4. [Débutant][copie object]modifications
    Par pacha1 dans le forum Langage
    Réponses: 11
    Dernier message: 15/07/2004, 13h17
  5. Réponses: 5
    Dernier message: 06/10/2003, 18h49

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo