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

Linux Discussion :

[BASH] Comparaison de deux fichiers


Sujet :

Linux

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    129
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Avril 2010
    Messages : 129
    Points : 84
    Points
    84
    Par défaut [BASH] Comparaison de deux fichiers
    Bonsoir,

    Je cherche à comparer deux fichiers (identiques ou pas).
    J'ai vu la fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    cmp fichier1 fichier2 > resultat
    Elle donne un résultat dans un autre fichier.

    Moi j'aimerai exploiter ce résultat et le mettre dans une variable.
    Et en fonction de la variable, j'affiche des messages par exemple.
    voilà ce que j'ai essayé mais ça ne marche pas
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    #!/bin/bash
    resultat=0  #initialisation du resultat
    cmp $1 $2 > $resultat
    if [ $resultat -eq 0 ]; then   #cmp retourne 0 si identiques
    	echo "Identiques !"
    elif [ $resultat -eq 1 ]; then    #cmp retourne 1 si NON identiques
    	echo "Non Identiques !"
    else		echo "Impossible d'accéder aux fichiers !"
    fi
    Je sais que cmp retourne 0 ou 1 mais dans fichier.
    Comment exploiter ce résultat qu'on peut pas mettre directement dans une variable?
    merci

  2. #2
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 688
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 688
    Points : 30 981
    Points
    30 981
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par seanbean Voir le message
    Bonsoir,

    Je cherche à comparer deux fichiers (identiques ou pas).
    J'ai vu la fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    cmp fichier1 fichier2 > resultat
    Elle donne un résultat dans un autre fichier.

    Moi j'aimerai exploiter ce résultat et le mettre dans une variable.
    Et en fonction de la variable, j'affiche des messages par exemple.
    voilà ce que j'ai essayé mais ça ne marche pas
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    #!/bin/bash
    resultat=0  #initialisation du resultat
    cmp $1 $2 > $resultat
    if [ $resultat -eq 0 ]; then   #cmp retourne 0 si identiques
    	echo "Identiques !"
    elif [ $resultat -eq 1 ]; then    #cmp retourne 1 si NON identiques
    	echo "Non Identiques !"
    else		echo "Impossible d'accéder aux fichiers !"
    fi
    Je sais que cmp retourne 0 ou 1 mais dans fichier.
    Comment exploiter ce résultat qu'on peut pas mettre directement dans une variable?
    merci
    Il faut bien faire la distinction entre
    1) ce qu'une commande affiche à l'écran
    2) son code de retour

    Ce qu'elle affiche c'est ce qu'on voit apparaitre quand on la lance. Son code retour, c'est une valeur comprise entre 0 et 255 indiquant si la commande s'est bien passée (0) où s'il y a eu un pb (1 à 255)

    La commande cmp n'affiche rien quand les fichiers sont égaux, et affiche la première différence rencontrée quand ils ne le sont pas.
    Voici un script utilisant cette caractéristique
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    #!/bin/bash
    resultat=$(cmp $1 $2)
    if [ -z "$resultat" ]; then
    	echo "Identiques ! (ou alors un des fichiers n'est pas accessible)"
    else
    	echo "Non Identiques !"
    fi
    Déjà tu remarques le problème principal: impossible de détecter une erreur d'accès, le message d'erreur éventuel passant pas le canal 2 n'étant jamais récupéré dans la variable "resultat".


    D'un autre coté, le code status est égal à 0 quand les fichiers sont identiques, à 1 s'ils sont différent et autre chose si autre pb. Cette caractéristique est déjà plus solide et permet de détecter les erreurs

    Voici donc un second script utilisant cette caractéristique plus profonde
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    #!/bin/bash
    cmp $1 $2 1>/dev/null 2>&1; resultat=$?
    if [ $resultat -eq 0 ]; then
    	echo "Identiques !"
    elif [ $resultat -eq 1 ]; then
    	echo "Différents"
    else		echo "Impossible d'accéder aux fichiers !"
    fi
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    129
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Avril 2010
    Messages : 129
    Points : 84
    Points
    84
    Par défaut
    Merci Sve@r pour ta réponse très détaillée et bien expliquée !

    J'ai tout compris et ça marche bien, seulement j'ai une question sur cette ligne dans ton deuxième code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    cmp $1 $2 1>/dev/null 2>&1; resultat=$?
    Ayant consulté la documentation Unix, je vois que "/dev/null" sert à diriger un contenu qu'on n'a pas besoin.
    Seulement j'ai pas bien compris cette ligne et aussi comment ça se passe pour l'affectation du résultat dans la variable "resultat".

    Merci de m'éclairer

  4. #4
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 688
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 688
    Points : 30 981
    Points
    30 981
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par seanbean Voir le message
    Ayant consulté la documentation Unix, je vois que "/dev/null" sert à diriger un contenu qu'on n'a pas besoin.
    Seulement j'ai pas bien compris cette ligne
    Merci de m'éclairer
    Ben tu l'as dit toi-même: je n'ai pas besoin de ce qu'affiche cmp, je ne l'utilise que pour son code retour
    Comme je l'ai dit, il faut distinguer
    1) ce que la commande affiche
    2) son code retour

    Dans ce cas précis, je ne veux utiliser cmp que pour son code retour. Or, quand elle sera exécutée, elle affichera quand-même
    - soit rien
    - soit qu'il y a une différence (le message passera par le canal 1)
    - soit qu'un des fichiers n'est pas accessibles (le message passera par le canal 2)

    Comme je ne veux pas que mon écran soit pollué par ces affichages qui ne m'intéressent pas ben je les renvoie vers la poubelle. Bref je me sers de cmp comme d'un palpeur. Et ce principe marche avec tout programme.

    Exemple pour détecter si un fichier existe ou n'existe pas (les vieux shell ne connaissent pas test -e donc mon palpeur que je choisis pour ce travail sera la commande "ls" qui renvoie une erreur si le fichier ciblé n'existe pas)
    Code bash : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    ls $1 1>/dev/null 2>&1; status=$?
    if test $status -eq 0
    then
        echo "$1 existe"
    else
        echo "$1 n'existe pas"
    fi

    De plus, comme if permet de détecter lui même la validité d'un code retour, ce dernier exemple peut se simplifier en
    Code bash : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    if ls $1 1>/dev/null 2>&1
    then
        echo "$1 existe"
    else
        echo "$1 n'existe pas"
    fi
    (ce que j'ai pas pu faire avec cmp car tu voulais séparer les 3 cas possibles)

    Citation Envoyé par seanbean Voir le message
    et aussi comment ça se passe pour l'affectation du résultat dans la variable "resultat".
    J'ai oublié de dire que le statut d'un programme est stocké dans la variable shell $?.
    De plus, cette variable étant la même pour tout programme exécuté, si j'appelle un second programme juste après avoir appelé cmp ben je perds le statut de cmp.
    Donc je le récupère la variable $? juste après avoir appelé cmp pour ne pas perdre son statut (le point-virgule sépare les deux instructions comme si elles étaient sur 2 lignes)

    ici tu peux télécharger mon tuto shell (lequel contient un exemple pour vérifier qu'un nombre est bien un nombre comme tu l'as demandé dans un autre topic...)
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    129
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Avril 2010
    Messages : 129
    Points : 84
    Points
    84
    Par défaut
    Vous étiez très clair pour l'explication !
    Je vois maintenant ce que vous voulez dire pour le statu de la commande et l'affichage de la commande.
    Je ne savais même pas que ça existait !
    Je viens de lire votre chapitre sur LES CONTRÔLES BOOLÉENS, c'est très bien fait et c'est bien expliqué je vous félicité.
    Cependant, c'est un peu dommage que beaucoup d'étudiants ne connaissent pas votre cours, en tout cas c'est 1000 plus mieux que celui de mon prof universitaire !

    Merci encore !

  6. #6
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 688
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 688
    Points : 30 981
    Points
    30 981
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par seanbean Voir le message
    Je viens de lire votre chapitre sur LES CONTRÔLES BOOLÉENS, c'est très bien fait et c'est bien expliqué je vous félicité.
    Merci

    Citation Envoyé par seanbean Voir le message
    Cependant, c'est un peu dommage que beaucoup d'étudiants ne connaissent pas votre cours, en tout cas c'est 1000 plus mieux que celui de mon prof universitaire !
    Ils n'ont qu'à venir le prendre. C'est 100% sans pub, 100% sans inscription et 100% gratuit
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Août 2008
    Messages
    154
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 154
    Points : 84
    Points
    84
    Par défaut
    je vais peut être dire une bétise mais pourquoi ne pas comparer leur MD5 ?

  8. #8
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 688
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 688
    Points : 30 981
    Points
    30 981
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par geek-59600 Voir le message
    je vais peut être dire une bétise mais pourquoi ne pas comparer leur MD5 ?
    Question de rapidité. cmp s'arrête à la première différence. Alors que calculer le md5 implique traiter systématiquement tout le fichier...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Comparaison de deux fichiers Excel
    Par Fab_lux dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 15/08/2007, 21h41
  2. comparaison de deux fichiers
    Par john123 dans le forum API standards et tierces
    Réponses: 5
    Dernier message: 17/03/2007, 16h38
  3. Comparaison de deux fichiers EXCEL
    Par meufeu dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 18/10/2006, 22h56
  4. comparaison de deux fichiers textes
    Par chmaichel dans le forum Delphi
    Réponses: 1
    Dernier message: 28/07/2006, 11h35
  5. [langage] Comparaison de deux fichiers
    Par perlgirl dans le forum Langage
    Réponses: 4
    Dernier message: 04/05/2005, 16h05

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