Forum Programmation.shell Comparaison de 2 fichiers dont un de référence

Posté par  . Licence CC By‑SA.
Étiquettes : aucune
-1
16
août
2020

Bonjour,

J'ai besoin de comparer deux fichiers FILE1 et FILE2 sur un serveur SERVER1, dit de référence, dans lesquels se trouvent deux arborescences à comparer.

FILE1 contient l'arborescence de référence :

Voici FILE 1 (à droite la taille) :

rep1 4096
rep1/fichier4.sh 375
rep1/fichier6.sh 551
rep1/fichier9.sh 332
rep1/rep11 4096
rep1/rep11/fichier1.sh 239
rep1/rep11/tutu.sh 19

Et FILE2 (en fait il contient l'arborescence concernée sur un second serveur), j'ai créé FILE2 sur le serveur de référence et je compare les deux fichiers :

rep2 4096
rep2/fichier4.sh 375
rep2/fichier6.sh 644
rep2/fichier9.sh 332
rep2/rep11 4096
rep2/rep11/fichier1.sh 239
rep2/rep11/rep22 4096
rep2/rep11/fichier.new.sh 6

Du fait que les bons fichiers sont dans FILE1, je souhaite faire remonter que :

1°) rep1/fichier6.sh doit avoir comme taille 551 (ou plus simplement rep1/fichier6.sh : 551)
2°) rep1/rep11/tutu.sh est dans la référence mais pas dans FILE2
3°) en revanche fichier.new.sh n'existe pas dans FILE1 donc on s'en moque, pas d'alerte le concernant.

En fait :
- tout ce qui est différent dans FILE1 par rapport à FILE2 doit remonter (c'est FILE1 la référence).
- tout ce qui existe dans FILE1 mais pas dans FILE2 doit remonter aussi.

J'ai tenté un sdiff mais c'est pas vraiment exploitable à grande échelle et pas bien lisible.

SERVER1:~ kevin$ sdiff -s FILE1 FILE2
rep2 4096 | rep1 4096
rep2/fichier4.sh 375 | rep1/fichier4.sh 375
rep2/fichier6.sh 644 | rep1/fichier6.sh 551
rep2/fichier9.sh 332 | rep1/fichier9.sh 332
rep2/rep11 4096 | rep1/rep11 4096
rep2/rep11/fichier1.sh 239 | rep1/rep11/fichier1.sh 239
rep2/rep11/rep22 4096 | rep1/rep11/tutu.sh 19
rep2/rep11/fichier.new.sh 6 <

Si j'arrivais à trouver une commande (ou un petit script) qui me donne quelque chose de beaucoup plus simple, genre :

rep1/fichier6.sh : taille 551
rep1/rep11/tutu.sh : n'existe pas sur mon serveur client

Si je ne tiens pas compte des chemins complet (avec un basename ) j'ai trouvé ceci :
awk 'NR==FNR {t[$0]++; next} !t[$0]' FILE2 FILE1
mais il faudrait que le chemin entier soir puis en compte….

… ce serait vraiment bien.

Un de vous a t-il une idée ?

Merci beaucoup.

  • # déjà-vu

    Posté par  . Évalué à 2.

    qu'est-ce qui a changé par rapport à la discussion ouverte sur un autre forum il y a 4 jours, et à laquelle il semblait que la solution proposée à base de rsync avait reçue ton aval ?

    et, ici aussi, il faut mettre les retours terminal dans des balises CODE !

    • [^] # Re: déjà-vu

      Posté par  . Évalué à 1.

      Bonjour,

      RSYNC parfait sur le même serveur, je dois voir si la fameuse commande qui marche bien peut-être lancée sur le serveur1 et comparer rep1 avec rep2 qui se trouve sur serveur2.

      [kevin@server1 ~]$ rsync -r --size-only --dry-run --out-format='%f :%l :%i ' rep1/ server2:/home/kevin/rep2 > COMP.txt

      Ensuite, j'ai pensé à une autre méthode : copier la 1ère arborescence de serveur1 (file1), idem sur serveur2 (file2) et copier file2 sur serveur 2 et comparer file1 et file2 afin de faire ressortir les éléments de file1 qui ne sont pas dans file2.

      Je suis en plein apprentissage j'essaie de penser à plusieurs solutions ça sera bénéfique pour moi.

      Tu en penses quoi ?

      • [^] # Re: déjà-vu

        Posté par  . Évalué à 1.

        Tu en penses quoi ?

        que tu devrais faire un effort et mettre les retours terminal dans des balises CODE.

        • [^] # Re: déjà-vu

          Posté par  . Évalué à 0. Dernière modification le 16 août 2020 à 13:45.

          Comment fait-on pour mettre les retour terminal ?

          Toi qui a un super niveau en shell tu as une idée sur mon souci?

          • [^] # Re: déjà-vu

            Posté par  . Évalué à 1. Dernière modification le 16 août 2020 à 13:53.

            Toi qui a un super niveau en shell tu as une idée sur mon souci?

            il n'y a pas de souci, tu n'as qu'à essayer la commande.

            quant aux balises CODE, ici, en bas de page, quand tu postes un message, il y a les indications (Aide‑mémoire sur la syntaxe Markdown) pour formater son message.

            • [^] # Re: déjà-vu

              Posté par  . Évalué à 1.

              Tu parles de RSYNC ? oui j'essaie demain. Ça va fonctionner ? Apparemment il faut rajouter l'instruction ssh dans la commande.

              Sinon l'autre technique pour comparer deux fichiers, avec la commande awk voici le résultat de mes tests chez moi:

              1°) Petit test concluant sur deux fichiers simples test1 et test2, je dois faire ressortir ce qu'il y dans test1 mais pas dans test2 (ou les différences) :

              server1:~ kevin$ cat test1
              salut 234
              bonjour 123
              bye 968
              azerty 1962
              kevin 254654
              papa 2019999999999
              server1:~ kesvin$ cat test2 
              salut 234
              bye 968
              azerty 1962
              papa 1234
              server1:~ kevin$ awk 'NR==FNR {t[$0]++; next} !t[$0]' test2 test1
              bonjour 123
              kevin 254654
              papa 2019999999999

              En si au lieu d'un nom de fichier il y a une arborescence voilà ce que cela donne :

              server1:~ kevin$ cat file1
              rep1  4096
              rep1/fichier4.sh  375
              rep1/fichier6.sh  644
              rep1/fichier9.sh  332
              rep1/rep11  4096
              rep1/rep11/fichier1.sh  239
              rep1/rep11/rep22  4096
              rep1/rep11/fichier.new.sh  6
              server1:~ kevin$ cat file2
              rep1  4096
              rep1/fichier4.sh  375
              rep1/fichier6.sh  551
              rep1/fichier9.sh  332
              rep1/rep11  4096
              rep1/rep11/fichier1.sh  239
              rep1/rep11/tutu.sh  19
              server1:~ kevin$ awk 'NR==FNR {t[$0]++; next} !t[$0]' file2 file1
              rep1/fichier6.sh  644
              rep1/rep11/rep22  4096
              rep1/rep11/fichier.new.sh  6

              Qu'en penses-tu ?

              • [^] # Re: déjà-vu

                Posté par  . Évalué à -3.

                Tu sèches ? je rigole.

                • [^] # Re: déjà-vu

                  Posté par  . Évalué à 3.

                  plonk.

                  • [^] # Re: déjà-vu

                    Posté par  . Évalué à -2. Dernière modification le 16 août 2020 à 15:12.

                    plonk ?
                    Que penses-tu de ma seconde solution, un avis d'expert est intéressant… Et puis ces forums sont destinés à cela……

                    • [^] # Re: déjà-vu

                      Posté par  . Évalué à 2. Dernière modification le 16 août 2020 à 23:20.

                      Salut,

                      Ce n'est pas juste la même question que posée ici il n'y a pas si longtemps ?

                      Bon, ok, le perl ou le R on ne s'y met pas en 30 secondes. Enfin pas plus que awk de toute façon.

                      Matricule 23415

              • [^] # Re: déjà-vu

                Posté par  (site web personnel) . Évalué à 2.

                Est-ce que comm ne répond pas à ton besoin ?

                • [^] # Re: déjà-vu

                  Posté par  . Évalué à 1. Dernière modification le 17 août 2020 à 19:13.

                  Son script awk effectue déjà une jointure gauche sur le chemin d'accès. Il a juste besoin d'enlever les répertoires racines et, éventuellement, de distinguer les répertoires des fichiers.

                  Edit: ah non, il effectue une jointure gauche sur l'entièreté de la ligne ($0). Enfin.

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.