J'ai un script shell dans lequel je dois vérifier si deux fichiers contiennent les mêmes données ou non. Je le fais pour beaucoup de fichiers, et dans mon script, la diff
commande semble être le goulot d'étranglement des performances.
Voici la ligne:
diff -q $dst $new > /dev/null
if ($status) then ...
Pourrait-il y avoir un moyen plus rapide de comparer les fichiers, peut-être un algorithme personnalisé au lieu de celui par défaut diff
?
diff
etcmp
.Réponses:
Je crois que
cmp
cela s'arrêtera à la première différence d'octet:la source
cmp -s $old $new
fonctionne également.-s
est l'abréviation de--silent
cmp
vérifiera d'abord la taille du fichier. Voici la version GNU, si vous voulez voir les optimisations supplémentaires qu'elle inclut: git.savannah.gnu.org/cgit/diffutils.git/tree/src/cmp.cJ'aime @Alex Howansky qui a utilisé 'cmp --silent' pour cela. Mais j'ai besoin d'une réponse à la fois positive et négative, donc j'utilise:
Je peux ensuite l'exécuter dans le terminal ou avec un ssh pour comparer les fichiers avec un fichier constant.
la source
echo success
commande (ou toute autre commande que vous mettez à sa place) échoue, votre commande "réponse négative" sera exécutée. Vous devez utiliser une construction "if-then-else-fi". Par exemple, comme cet exemple simple .Pourquoi n'obtenez-vous pas le hachage du contenu des deux fichiers?
Essayez ce script, appelez-le par exemple script.sh puis exécutez-le comme suit: script.sh file1.txt file2.txt
la source
1/(2^511)
. À moins que vous ne craigniez que quelqu'un essaye intentionnellement de créer une collision, l'idée que cette méthode produise un faux positif n'est pas vraiment une préoccupation sérieuse.cmp
est encore plus efficace, car il n'a pas à lire l'intégralité du fichier dans le cas où les fichiers ne correspondent pas.Parce que je suis nul et que je n'ai pas assez de points de réputation, je ne peux pas ajouter cette friandise comme commentaire.
Mais, si vous allez utiliser la
cmp
commande (et n'avez pas besoin / ne voulez pas être verbeux), vous pouvez simplement saisir l'état de sortie. Par lacmp
page de manuel:Donc, vous pourriez faire quelque chose comme:
la source
cmp --silent $FILE1 $FILE2 ; if [ "$?" == "1" ]; then echo "files differ"; fi
qui, à son tour, est une façon de faire plus compliquéecmp --silent $FILE1 $FILE2 || echo "files differ"
car vous pouvez utiliser directement la commande dans l'expression. Il remplace$?
. En conséquence, l'état existant de la commande sera comparé. Et c'est ce que fait l'autre réponse. btw. Si quelqu'un a du mal--silent
, ce n'est pas pris en charge partout (busybox). use-s
Pour les fichiers qui ne sont pas différents, toute méthode nécessitera d'avoir lu les deux fichiers entièrement, même si la lecture a été dans le passé.
Il n'y a pas d'alternative. La création de hachages ou de sommes de contrôle à un moment donné nécessite donc la lecture de l'intégralité du fichier. Les gros fichiers prennent du temps.
La récupération des métadonnées de fichiers est beaucoup plus rapide que la lecture d'un fichier volumineux.
Alors, existe-t-il des métadonnées de fichier que vous pouvez utiliser pour établir que les fichiers sont différents? Taille du fichier ? ou même les résultats de la commande file qui ne fait que lire une petite partie du fichier?
Exemple de fragment de code de taille de fichier:
Si les fichiers sont de la même taille, vous êtes bloqué avec des lectures complètes de fichiers.
la source
ls -n
pour éviter les problèmes si les noms d'utilisateur ou de groupe ont des espaces.Essayez également d'utiliser la commande cksum:
La commande cksum affichera le nombre d'octets d'un fichier. Voir «man cksum».
la source
md5
lit tout le fichier de toute façon, donccmp
, s'arrêter à la première différence, sera beaucoup plus rapide.En faisant des tests avec un Raspberry Pi 3B + (j'utilise un système de fichiers en superposition et j'ai besoin de synchroniser périodiquement), j'ai effectué une comparaison de moi-même pour diff -q et cmp -s; notez qu'il s'agit d'un journal à l'intérieur de / dev / shm, donc les vitesses d'accès au disque ne sont pas un problème:
Je l'ai couru plusieurs fois. cmp -s avait systématiquement des temps légèrement plus courts sur la boîte de test que j'utilisais. Donc, si vous voulez utiliser cmp -s pour faire des choses entre deux fichiers ....
la source