Linux / Commande cmp : comparer deux fichiers octet par octet
La commande GNU cmp compare deux entrées octet par octet. Si elles sont identiques sur toute la portée comparée, elle ne produit normalement aucun message et renvoie le code 0 ; à la première différence, elle indique sa position et renvoie 1. Un problème de lecture ou d’arguments renvoie 2 : un script doit distinguer ce cas d’une vraie différence.
Les exercices utilisent uniquement de petits fichiers créés dans un nouveau dossier de pratique. Le manuel officiel GNU Diffutils pour cmp décrit les codes de sortie et le repérage des octets ; sa liste des options de cmp précise les limites et décalages. Vérifiez votre version avec cmp --help ou man cmp.
Que signifie le résultat de cmp ?
| Code de sortie | Signification | Action dans un script |
|---|---|---|
0 |
Aucune différence trouvée dans la portée comparée. | Continuer seulement si cette portée couvre réellement les fichiers voulus. |
1 |
Les données comparées diffèrent, y compris si un fichier se termine avant l’autre. | Traiter le changement attendu ou vérifier la source et la copie. |
2 |
La comparaison a rencontré un problème. | Lire le diagnostic et arrêter ou corriger l’entrée. |
Les numéros d’octet et de ligne rapportés par GNU cmp commencent à 1. La « ligne » compte les séparateurs de ligne rencontrés avant le premier octet différent ; sur un fichier binaire, cette indication n’a pas nécessairement de sens humain. Si un fichier est le préfixe exact de l’autre, GNU cmp signale sa fin de fichier plutôt qu’un octet différent à l’intérieur du préfixe.
Comparer deux fichiers entiers et lire la première différence
cmp [OPTION]... FICHIER_A [FICHIER_B [SAUT_A [SAUT_B]]]
Le second fichier peut être omis pour lire l’entrée standard ; le nom - désigne également l’entrée standard. Mettez entre guillemets les chemins contenant des espaces et séparez les options des noms commençant par un tiret avec -- lorsque la version le permet. Le premier exercice crée deux fichiers identiques et un troisième dont le troisième octet diffère :
lab=$(mktemp -d "$HOME/cmp-lab.XXXXXX") || exit 1
printf 'ABCD\n' > "$lab/a.bin"
cp -- "$lab/a.bin" "$lab/b.bin"
printf 'ABXD\n' > "$lab/c.bin"
cmp -- "$lab/a.bin" "$lab/b.bin"
if cmp -- "$lab/a.bin" "$lab/c.bin"; then
printf 'Identiques\n'
else
status=$?
printf 'Code de comparaison : %s\n' "$status"
fi
La première comparaison ne doit rien afficher. La seconde doit signaler un désaccord à l’octet 3, ligne 1, puis afficher le code 1. Le texte exact du diagnostic peut varier avec la locale et la version. Après une copie importante, contrôlez aussi que la source n’a pas changé pendant la lecture ; cmp compare les octets au moment où il les lit, sans créer d’instantané cohérent.
Utiliser cmp -s dans un script sans masquer une erreur
L’option -s ou --silent supprime les messages et laisse seulement le code de sortie. Un simple else qui appelle tout « différent » confond une différence avec un fichier absent ou une lecture impossible. Testez le code précisément :
if cmp -s -- "$lab/a.bin" "$lab/b.bin"; then
printf 'Même contenu\n'
else
status=$?
if test "$status" -eq 1; then
printf 'Contenus différents\n'
else
printf 'Comparaison impossible : code %s\n' "$status" >&2
fi
fi
Pour les deux fichiers de pratique identiques, le message attendu est « Même contenu ». Si vous remplacez b.bin par le chemin connu c.bin dans ce dossier, la branche « Contenus différents » doit être choisie. Un fichier absent ou inaccessible relève de la branche d’erreur ; ne prenez pas une décision de déploiement sur la seule absence de sortie avec -s.
Comparer une portion précise avec -n et -i
-n N limite la comparaison à N octets lus après tout décalage ; un code 0 signifie alors « égaux dans cette portion », pas « fichiers entiers égaux ». -i N saute les N premiers octets de chaque entrée. La forme GNU -i N:M saute des quantités différentes. Les arguments facultatifs SAUT_A et SAUT_B de la syntaxe ont le même rôle. Vérifiez toujours la taille attendue avant de considérer le résultat comme une preuve d’intégrité.
Dans ce bloc, les huit premiers octets diffèrent mais la suite est identique. La comparaison après saut réussit ; une comparaison limitée aux quatre premiers octets échoue :
printf 'AAAAAAAApayload\n' > "$lab/header-a.bin"
printf 'BBBBBBBBpayload\n' > "$lab/header-b.bin"
cmp -i 8 -- "$lab/header-a.bin" "$lab/header-b.bin"
if cmp -n 4 -- "$lab/header-a.bin" "$lab/header-b.bin"; then
printf 'Préfixes identiques\n'
else
printf 'Préfixes différents\n'
fi
cmp -i 8 ne doit rien afficher ; le second appel doit signaler la première différence et afficher « Préfixes différents ». Pour comparer uniquement un en-tête réel, choisissez sa longueur d’après la spécification du format, pas d’après une valeur devinée. Un en-tête identique ne garantit pas que le reste du fichier le soit.
Choisir les options et l’outil de comparaison adapté
| Option ou outil | Usage | Limite |
|---|---|---|
cmp |
Signale le premier octet différent et sa ligne. | Ne donne pas une vue lisible des modifications de texte. |
cmp -s |
Ne produit pas de message ; permet une décision par code de sortie. | Il faut distinguer les codes 1 et 2. |
cmp -l |
Liste les positions décimales et les valeurs octales des octets différents. | Peut produire énormément de lignes pour de gros fichiers. |
cmp -b |
Affiche aussi des représentations imprimables des octets différents. | Les caractères de contrôle restent codés, pas interprétés. |
cmp -i N[:M] |
Ignore un préfixe identique ou des préfixes de tailles distinctes. | La portion ignorée n’est pas vérifiée. |
cmp -n N |
Compare au plus N octets. |
Ne prouve rien sur la suite. |
diff |
Présente des changements de lignes de texte. | Ne remplace pas la comparaison binaire octet par octet. |
sha256sum |
Produit une empreinte à conserver ou comparer à distance. | Exige une référence fiable ; ne montre pas la position d’un changement. |
Pour de nombreux fichiers ou des fichiers sur deux machines, une liste d’empreintes peut être plus pratique qu’un cmp direct. Pour une copie locale précise, cmp donne une réponse immédiate sur les octets lus. Dans les deux cas, des octets identiques ne prouvent ni la provenance, ni la validité du format, ni l’égalité des permissions, propriétaires et autres métadonnées. La commande cp montre comment copier des fichiers et vérifier séparément leur contenu et leurs attributs.
Questions fréquentes
Aucune sortie de cmp signifie-t-elle que les fichiers sont identiques ?
Seulement si la commande s’est terminée avec le code 0 et que la portée choisie couvre les fichiers entiers. Avec -s, l’absence de message accompagne aussi les différences et les erreurs.
Comment afficher tous les octets différents ?
Utilisez cmp -l FICHIER_A FICHIER_B, en gardant à l’esprit que la sortie peut devenir très longue.
Quand préférer diff à cmp ?
diff convient aux lignes de texte que vous voulez lire ou corriger ; cmp convient à l’égalité exacte d’octets et à la première position différente.
cmp vérifie-t-il les permissions et les dates ?
Non. Il compare les données lues. Utilisez stat ou les outils adaptés pour vérifier les attributs nécessaires.
La référence des commandes Linux par tâche situe cmp parmi les outils de comparaison.




