web-dev-qa-db-fra.com

Fonction de comparaison qui compare deux fichiers texte sous Unix

Je me demandais si quelqu'un pouvait me dire s'il existe une fonction disponible sous unix, bash, qui compare toutes les lignes des fichiers. S'ils sont différents, il doit afficher vrai/faux, ou -1,0,1. Je sais que ces fonctions cmp existent dans d'autres langues. J'ai regardé autour des pages de manuel mais sans succès. S'il n'est pas disponible, quelqu'un pourrait-il m'aider à trouver une solution alternative?

Merci

13
Masterminder

Il y a plusieurs moyens de le faire:

  • cmp -s file1 file2: Regardez la valeur de $?. Zéro si les deux fichiers correspondent ou non nul dans le cas contraire.
  • diff file1 file2 > /dev/null: Certaines formes de la commande diff peuvent prendre un paramètre qui lui dit de ne rien afficher. Cependant, la plupart ne le font pas. Après tout, vous utilisez diff pour voir les différences entre deux fichiers. Encore une fois, le code de sortie (vous pouvez vérifier la valeur de $? sera égal à 0 si les fichiers correspondent et différent de zéro dans le cas contraire.

Vous pouvez utiliser ces commandes dans une instruction Shell if:

if cmp -s file1 file2
then
   echo "The files match"
else
   echo "The files are different"
fi

La commande diff est spécialement conçue pour les fichiers texte. La commande cmp devrait également fonctionner avec tous les fichiers binaires.

34
David W.

Il y a un simple cmp file file commande qui fait exactement cela. Il renvoie 0 s'ils sont égaux et 1 s'ils sont différents, c'est donc trivial à utiliser dans ifs:

if cmp file1 file1; then
    ...
fi

J'espère que cela aide =)

#!/bin/bash

file1=old.txt
file2=new.txt

echo " TEST 1 : "
echo

if [ $( cmp -s ${file1} ${file2}) ]
then
   echo "The files match"
else
   echo "The files are different"
fi

echo
echo " TEST 2 : "
echo
bool=$(cmp -s "$file1" "$file2" )
if cmp -s "$file1" "$file2"
then
   echo "The files match"
else
   echo "The files are different"
fi

echo
echo " TEST 3 : "
echo

md1=$(md5 ${file1});
md2=$(md5 ${file2});

mdd1=$(echo $md1 | awk '{print $4}' ) 
mdd2=$(echo $md2 | awk '{print $4}' ) 
echo $md1
echo $mdd1
echo $md2
echo $mdd2
echo

#if [ $mdd1 = $mdd2 ]; 
if [ $mdd1 -eq $mdd2 ]; 
then
   echo "The files match"
else
   echo "The files are different"
fi
1
kris

Vous pouvez faire un md5 sur les deux fichiers, puis comparer les résultats dans bash.

Aucune boîte Unix ici à tester, mais cela devrait être correct.

#!/bin/bash

md1=$(md5 file1);
md2=$(md5 file2);

if [ $md1 -eq $ $md2 ]; then
  echo The same
else
  echo Different
fi
0

echo "lire le premier fichier" lire f1 echo "lire le second fichier" lire f2

diff -s f1 f2 # imprime si les deux fichiers sont identiques

0
sovick konar