J'ai deux fichiers de tailles 124665 et 124858 en octets et je veux vérifier si file1 est un préfixe de file2 ou non.
files
file-comparison
tvorog
la source
la source
cmp
serait mieuxdiff
qu'ici?cmp
fait une simple comparaison d'octet à octet, et retourne dès qu'il trouve une différence, alorsdiff
qu'un utilitaire de texte va utiliser un algorithme complexe pour vous montrer toutes les différences entre les deux fichiers qui ne vous intéressent pas.Si votre système a la
cmp
commande de GNUdiffutils
, alors une option estcomparer au maximum les 124665 premiers octets des deux fichiers et signaler s'ils diffèrent - ou, plus généralement
la source
$(stat -c %s file1)
la taille en octets? Est-ce quewc
réellement ouvrir et traiter le fichier entier pour obtenir le nombre d'octets?wc
implémentations optimiseront ce cas et feront unfstat()
(ou / et unlseek(SEEK_END)
) donc seront aussi efficaces que possible. D'un autre côté, c'eststat -c
spécifique à GNU.cmp
, vous pouvez raisonnablement supposer qu'elle est spécifique à GNUstat
.GNU
cmp
peut résoudre le problème d'une manière plus simple:Il y a quatre sorties possibles (sauf erreur).
Pas de sortie: les fichiers sont identiques.
cmp: EOF on file1
: file1 est un préfixe de file2.cmp: EOF on file2
: file2 est un préfixe de file1.file1 file2 differ: byte NNN, line MMM
: Aucun n'est un préfixe de l'autre.Malheureusement, c'est un peu gênant à utiliser dans un script, car ces cas ne semblent pas être distingués dans le code de sortie. De plus, les
EOF on file1
messages vont à stderr, tandis que lefile1 file2 differ
message va à stdout.Je suppose que les autres versions de
cmp
font quelque chose de similaire, mais je n'ai pas vérifié.la source
cmp
n'est pas une commande GNU uniquement et n'y est pas originaire, elle était déjà dans la première version d'Unix au début des années 70. L'-n
option est cependant spécifique à GNU.cmp file1 file2 2>&1 | grep EOF on file1
cmp
c'était unique à GNU, juste que GNUcmp
était la seule version que j'ai essayée. J'ai ajouté une phrase pour clarifier.file1
et l'autre est nomméfile12
. (Ou pire encore, que se passe-t-il si le deuxième fichier est nomméEOF on file1
?) La résolution de cette utilisation robustecmp
est probablement beaucoup plus difficile que d'écrire le programme évident de 5 lignes en C ...cmp
est si étroitement contrainte. L'utilisation de l'-x
option ongrep
pour faire correspondre la ligne entière prendra en charge tous les cas, sauf les plus exotiques (par exemple, les nouvelles lignes dans le nom de fichier).