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 fichiers


Sujet :

Shell et commandes GNU

  1. #1
    Membre du Club
    Homme Profil pro
    Analyse système
    Inscrit en
    Août 2020
    Messages
    160
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Analyse système
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2020
    Messages : 160
    Points : 59
    Points
    59
    Par défaut Comparaison de fichiers
    Bonjour,
    Besoin de vos lumières car je tourne en rond. J’aimerais faire remonter les différences entre les deux fichiers ci-dessous :

    Fichier file1 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    tutu 123
    azerty 454
    toto 45
    qwerty 9879
    titi 789
    tete 7667
    salut 387
    Fichier file2 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    tutu 123
    toto 6745
    qwerty 9879
    tete 8037
    salut 387
    C’est-à-dire un script qui me dit que « azerty » ne figure pas dans file2, que « toto » est différent dans file2, que « titi » ne figure pas dans file2, etc……

    En revanche j’arrive à sortir les lignes identiques avec le script suivant :

    Script compare.sh :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    #!/bin/bash
    while read line1; do
            while read line2; do
                    if [ "$line2" = "$line1" ]
                    then
                            echo "Les lignes $line1 et $line2 sont identiques"
                            break
                    fi
            done < file2
    done < file1
    Résultat :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Les lignes tutu 123 et tutu 123 sont identiques
    Les lignes qwerty 9879 et qwerty 9879 sont identiques
    Les lignes salut 387 et salut 387 sont identiques
    J’aimerais plutôt faire ressortir les différences et pas les analogies.

    Avez-vous une évolution de mon script à me proposer ?

    Merci.

  2. #2
    Membre du Club
    Homme Profil pro
    Analyse système
    Inscrit en
    Août 2020
    Messages
    160
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Analyse système
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2020
    Messages : 160
    Points : 59
    Points
    59
    Par défaut
    J’arrive à contourner la chose en rajoutant :
    sed -i/$line1/d” file2 juste après le echo.
    Du coup dans file2 il me reste uniquement les lignes différentes(c’est bien) mais il ne me dit pas que azerty ne figure pas dans file2.
    En fait ma première colonne correspond à des noms de fichiers et la seconde leur taille.

  3. #3
    Membre éprouvé Avatar de balkany
    Homme Profil pro
    Touriste
    Inscrit en
    Juillet 2017
    Messages
    346
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Touriste

    Informations forums :
    Inscription : Juillet 2017
    Messages : 346
    Points : 977
    Points
    977
    Par défaut
    Il s'agit d'un exercice je suppose ?
    Si non, il existe la commande diff qui est faite pour ça.

  4. #4
    Membre éprouvé Avatar de balkany
    Homme Profil pro
    Touriste
    Inscrit en
    Juillet 2017
    Messages
    346
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Touriste

    Informations forums :
    Inscription : Juillet 2017
    Messages : 346
    Points : 977
    Points
    977
    Par défaut
    C'est quoi les contraintes de l'exo ? quels langages, commandes, etc. as-tu le droit d'utiliser ?
    Sinon diff a de nombreuses options de mise en forme de sa sortie, et il existe des variantes de cette commande, comme sdiff, elle-même munie d'options de formatage.
    Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $ sdiff -s file1 file2
    azerty 454						      |	toto 6745
    toto 45							      <
    titi 789						      |	tete 8037
    tete 7667						      <

  5. #5
    Membre du Club
    Homme Profil pro
    Analyse système
    Inscrit en
    Août 2020
    Messages
    160
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Analyse système
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2020
    Messages : 160
    Points : 59
    Points
    59
    Par défaut
    Les contraintes : faire un script Shell mais je peux utiliser ce que je veux du moment que ça marche.

    L’objectif est de comparer la même arborescence sur deux serveurs différents, un des serveurs (le 1) est la référence.

    Donc j’ai réussi à créer 2 fichiers formatés de la même manière :
    - un de référence (file1)
    - un second (file2) qu’il faut comparer à cette référence file1 afin de faire ressortir les fichiers de taille différente et ceux qui existent sur la référence mais pas dans l’autre.

    Format des deux fichiers :
    - 1ere colonne : nom de fichier.
    Dans mon exemple dans un souci de simplicité je fais ressortir le dernier qualifieur avec un basename mais idéalement si on peut gérer l’arborescence c’est bien mieux.
    - seconde colonne : la taille.

    Et on compare les deux fichiers et on alerte.

  6. #6
    Membre éprouvé Avatar de balkany
    Homme Profil pro
    Touriste
    Inscrit en
    Juillet 2017
    Messages
    346
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Touriste

    Informations forums :
    Inscription : Juillet 2017
    Messages : 346
    Points : 977
    Points
    977
    Par défaut
    Bah si t'as le droit d'utiliser n'importe quelle commande, autant tout faire dans awk pour une comparaison de ce genre.
    Mais sinon, s'il s'agit vraiment de comparer deux arborescences, tu pourrais le faire via rsync par exemple.
    Selon tes critères, ça donnerait quelque chose comme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    rsync -rv --size-only --dry-run /chemin1/ /chemin2
    (attention au / final dans /chemin1/, pour comparer ce qui se trouve sous /chemin1/ et sous /chemin2/)

  7. #7
    Membre du Club
    Homme Profil pro
    Analyse système
    Inscrit en
    Août 2020
    Messages
    160
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Analyse système
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2020
    Messages : 160
    Points : 59
    Points
    59
    Par défaut
    Merci :-)
    J’avoue n’avoir jamais utilisé cette commande qui semble puissante.
    Donc ta commande permettra de comparer /chemin1/ et /chemin2/ et affichera l’écran les fichiers de /chemin1/ qui sont différents ou inexistants dans /chemin2/ ?
    Inexistants ça serait bien aussi pour mettre /chemin2/ au même niveau que /chemin1/.
    Est ce possible d avoir la taille dans le résultat de la commande ?
    Tu m’es d’une aide précieuse merci bcp.

  8. #8
    Membre éprouvé Avatar de balkany
    Homme Profil pro
    Touriste
    Inscrit en
    Juillet 2017
    Messages
    346
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Touriste

    Informations forums :
    Inscription : Juillet 2017
    Messages : 346
    Points : 977
    Points
    977
    Par défaut
    Oh oui, rsync est une commande redoutable (versatile, comme dit son manuel en anglais).
    En l'occurrence, oui, les critères de choix de fichiers ci-dessus prendront les fichiers qui existent dans /chemin1 mais pas dans /chemin2, et ceux qui existent des deux côtés mais sont de tailles différentes.
    Pour l'affichage, tu as l'option --out-format, qui offre beaucoup de possibilités (cf. man rsync et man rsyncd.conf).
    Pour ce que tu demandes, je dirais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    rsync -r --size-only --dry-run --out-format='%f:%l:%i' /chemin1/ /chemin2
    Le %i en particulier te permettra de distinguer entre les fichiers qui n'existent pas dans /chemin2, et ceux qui diffèrent en taille.
    (le séparateur entre les indicateurs de format est à choisir convenablement : ici j'ai mis :, mais on peut mettre ce qu'on veut…)

  9. #9
    Membre du Club
    Homme Profil pro
    Analyse système
    Inscrit en
    Août 2020
    Messages
    160
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Analyse système
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2020
    Messages : 160
    Points : 59
    Points
    59
    Par défaut
    Super ... j’essaie ça demain de te dis :-)
    Thanks

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 552
    Points : 19 386
    Points
    19 386
    Par défaut
    awk et sed sont des langages à part entière, donc, stricto sensu, pas du shell ! on est plus près du shell avec diff.

    si tu n'élabores pas un algorithme (un peu) robuste, tu vas créer un monstre, genre créature de Frankenstein, avec plein de rustines, qui tient avec des bouts de ficelles. en bref, un truc dégueu.

    donc,
    d'abord, tu prends ton code, et tu le mets de côté (pas trop loin de la corbeille; il pourrait y tomber par inadvertance. )
    ensuite, tu élabores un algorithme, qui tient compte du cahier des charges. c'est primordial !
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  11. #11
    Expert éminent Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 035
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 035
    Points : 8 400
    Points
    8 400
    Par défaut
    salut,

    sur les arborescences directement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    diff -r 1/ 2/
    Seulement dans 1/: azerty
    Seulement dans 1/: titi

  12. #12
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 280
    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 280
    Points : 12 729
    Points
    12 729
    Par défaut
    ça peut aussi être sympa à faire uniquement en built-in d'un shell quelconque...
    Cordialement.

  13. #13
    Expert éminent sénior Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 243
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 243
    Points : 13 458
    Points
    13 458
    Par défaut
    Bonjour

    Comme l'ordre n'a pas l'air de compter, j'aurais naturellement utilisé comm.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    comm <(sort fichier1.txt) <(sort fichier2.txt)
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  14. #14
    Membre du Club
    Homme Profil pro
    Analyse système
    Inscrit en
    Août 2020
    Messages
    160
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Analyse système
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2020
    Messages : 160
    Points : 59
    Points
    59
    Par défaut
    Merci à tous, je test vos idées demain et vous dis

  15. #15
    Membre du Club
    Homme Profil pro
    Analyse système
    Inscrit en
    Août 2020
    Messages
    160
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Analyse système
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2020
    Messages : 160
    Points : 59
    Points
    59
    Par défaut
    Bonjour, après une journée de galère suite à une petite chute en courant (genoux), j'ai testé cette super commande RSYNC mais voilà ce que j'obtiens, je dois louper quelque chose..

    Afin de tester voici ce que j'ai fait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    [root@server1 kevin]# tree -s rep1
    rep1
    |-- [        375]  fichier4.sh
    |-- [        551]  fichier6.sh
    |-- [        332]  fichier9.sh
    `-- [       4096]  rep11
        |-- [        239]  fichier1.sh
        `-- [         19]  tutu.sh
     
    1 directory, 5 files
    [root@server1 kevin]# tree -s rep2
    rep2
    |-- [        375]  fichier4.sh
    |-- [        644]  fichier6.sh
    |-- [        332]  fichier9.sh
    |-- [       4096]  rep11
    |   `-- [        239]  fichier1.sh
    `-- [       4096]  rep22
        `-- [          6]  fichier.new.sh
     
    2 directories, 5 files
    [root@server1 kevin]# rsync -r --size-only --dry-run --out-format='%f :%l :%i ' rep1 rep2
    rep1 :4096 :cd+++++++++ 
    rep1/fichier4.sh :375 :>f+++++++++ 
    rep1/fichier6.sh :551 :>f+++++++++ 
    rep1/fichier9.sh :332 :>f+++++++++ 
    rep1/rep11 :4096 :cd+++++++++ 
    rep1/rep11/fichier1.sh :239 :>f+++++++++ 
    rep1/rep11/tutu.sh :19 :>f+++++++++
    rep1 est mon répertoire de référence que je gère moi-même, et rep2 un autre répertoire que des utilisateurs peuvent modifier à leur bon vouloir mais ce n'est pas forcement bien.
    L'idée est de faire remonter toute différence entre rep2 et rep1 pour, à terme, mettre rep2 au même niveau que rep1.

    1) fichier4.sh et fichier9.sh sont identiques de chaque côté donc ils ne devraient pas remonter en alerte.
    2) fichier6.sh de référence (rep1) est de taille différente à celui qui se trouve dans rep2 donc il faudrait alerter.
    3) Dans la référence rep1, il y a un sous-répertoire rep11 ==> c'est uniquement tutu.sh qui doit remonter en alerte car existe sur la référence mais pas sur l'autre.
    En ce qui concerne fichier1.sh ils sont identiques de chaque côté donc ne doit pas remonter.
    4) fichier.new.sh ne remonte pas et c'est bien car ne figure pas dans la référence.

    Objectif = faire remonter via un message :
    - rep1/fichier6.sh pour sa taille qui diffère par rapport à celui de rep2
    - rep1/rep11/tutu.sh car il existe sur le répertoire de référence uniquement (rep1) mais pas dans rep2.

  16. #16
    Membre éprouvé Avatar de balkany
    Homme Profil pro
    Touriste
    Inscrit en
    Juillet 2017
    Messages
    346
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Touriste

    Informations forums :
    Inscription : Juillet 2017
    Messages : 346
    Points : 977
    Points
    977
    Par défaut
    Citation Envoyé par balkany Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    rsync -rv --size-only --dry-run /chemin1/ /chemin2
    (attention au / final dans /chemin1/, pour comparer ce qui se trouve sous /chemin1/ et sous /chemin2/)

  17. #17
    Membre du Club
    Homme Profil pro
    Analyse système
    Inscrit en
    Août 2020
    Messages
    160
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Analyse système
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2020
    Messages : 160
    Points : 59
    Points
    59
    Par défaut
    Merci l'ami :

    [kevin@server1 ~]$ rsync -rv --size-only --dry-run rep1/ rep2
    sending incremental file list
    fichier6.sh
    rep11/tutu.sh

    sent 163 bytes received 19 bytes 364.00 bytes/sec
    total size is 1516 speedup is 8.33 (DRY RUN)


    ==> Cela me paraît bien… super !

    Sinon j'ai essayé cela qui ressemble : rsync -rcnC --out-format="%f" rep1/ rep2
    rep1/fichier6.sh
    rep1/rep11/tutu.sh

    Si y'a moyen d'ajouter la taille ce serait top…

  18. #18
    Membre éprouvé Avatar de balkany
    Homme Profil pro
    Touriste
    Inscrit en
    Juillet 2017
    Messages
    346
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Touriste

    Informations forums :
    Inscription : Juillet 2017
    Messages : 346
    Points : 977
    Points
    977
    Par défaut
    Attention (au cas où ça ne serait pas fait exprès), là tu es reparti sur le format de base, qui ne différencie pas les ajouts et les différences de tailles.
    Il fallait ajouter le / final à ta commande en #16 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    rsync -r --size-only --dry-run --out-format='%f :%l :%i ' rep1/ rep2

  19. #19
    Membre du Club
    Homme Profil pro
    Analyse système
    Inscrit en
    Août 2020
    Messages
    160
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Analyse système
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2020
    Messages : 160
    Points : 59
    Points
    59
    Par défaut
    Citation Envoyé par balkany Voir le message
    Attention (au cas où ça ne serait pas fait exprès), là tu es reparti sur le format de base, qui ne différencie pas les ajouts et les différences de tailles.
    Il fallait ajouter le / final à ta commande en #16 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    rsync -r --size-only --dry-run --out-format='%f :%l :%i ' rep1/ rep2

    Ca donne cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    rsync -r --size-only --dry-run --out-format='%f :%l :%i ' rep1/ rep2
    rep1/fichier6.sh :551 :>f.sT...... 
    rep1/rep11/tutu.sh :19 :>f+++++++++

  20. #20
    Membre du Club
    Homme Profil pro
    Analyse système
    Inscrit en
    Août 2020
    Messages
    160
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Analyse système
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2020
    Messages : 160
    Points : 59
    Points
    59
    Par défaut
    En résumé ta solution est top :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    [kevin@server1 ~]$ rsync -r --size-only --dry-run --out-format='%f :%l :%i ' rep1/ rep2
    rep1/fichier6.sh :551 :>f.sT...... 
    rep1/rep11/tutu.sh :19 :>f+++++++++
    Est-ce possible de supprimer les caractères en bout de lignes : ":>f.sT...... " et ":>f+++++++++ " … et qui sait peut-être remplacer ces caractères par un commentaire genre "taille différente" et pour le second "inexistant sur …" ?

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Comparaison de fichiers text
    Par mick84m dans le forum Shell et commandes GNU
    Réponses: 2
    Dernier message: 22/07/2005, 16h48
  2. [Debutant(e)]comparaison de fichier : imprimer
    Par demostene dans le forum Eclipse Java
    Réponses: 7
    Dernier message: 06/07/2004, 10h43
  3. Comparaison de fichiers Word
    Par Zelphalya dans le forum Langage
    Réponses: 5
    Dernier message: 20/10/2003, 15h15
  4. [langage] Comparaison de fichiers
    Par Jibees dans le forum Langage
    Réponses: 3
    Dernier message: 23/04/2003, 16h27
  5. Comparaison de fichier
    Par danzerg dans le forum Langage
    Réponses: 2
    Dernier message: 21/02/2003, 11h49

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