Réponses:
Supposons que vous ayez la taille de file1
dans la variable FILE1_SZ
et que votre head
implémentation prenne en charge l' -c
option (non standard) :
if head -c "$FILE1_SZ" file2 | cmp -s - file1; then
echo "file1 is a prefix of file2"
else
echo "file1 is not a prefix of file2"
fi
cmp
fait une simple comparaison d'octet à octet, et retourne dès qu'il trouve une différence, alors diff
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 GNU diffutils
, alors une option est
cmp -n 124665 file1 file2
comparer au maximum les 124665 premiers octets des deux fichiers et signaler s'ils diffèrent - ou, plus généralement
cmp -n "$(wc -c < file1)" file1 file2
$(stat -c %s file1)
la taille en octets? Est-ce que wc
réellement ouvrir et traiter le fichier entier pour obtenir le nombre d'octets?
wc
implémentations optimiseront ce cas et feront un fstat()
(ou / et un lseek(SEEK_END)
) donc seront aussi efficaces que possible. D'un autre côté, c'est stat -c
spécifique à GNU.
cmp
, vous pouvez raisonnablement supposer qu'elle est spécifique à GNU stat
.
GNU cmp
peut résoudre le problème d'une manière plus simple:
cmp file1 file2
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 le file1 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é.
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 GNU cmp
é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 robuste cmp
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 on grep
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).
cmp
serait mieuxdiff
qu'ici?