Réponses:
Supposons que vous ayez la taille de file1dans la variable FILE1_SZet que votre headimplémentation prenne en charge l' -coption (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
cmpfait une simple comparaison d'octet à octet, et retourne dès qu'il trouve une différence, alors diffqu'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 cmpcommande 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 wcréellement ouvrir et traiter le fichier entier pour obtenir le nombre d'octets?
wcimplé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 -cspécifique à GNU.
cmp, vous pouvez raisonnablement supposer qu'elle est spécifique à GNU stat.
GNU cmppeut 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 file1messages vont à stderr, tandis que le file1 file2 differmessage va à stdout.
Je suppose que les autres versions de cmpfont quelque chose de similaire, mais je n'ai pas vérifié.
cmpn'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' -noption est cependant spécifique à GNU.
cmp file1 file2 2>&1 | grep EOF on file1
cmpc'était unique à GNU, juste que GNU cmpétait la seule version que j'ai essayée. J'ai ajouté une phrase pour clarifier.
file1et 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 cmpest probablement beaucoup plus difficile que d'écrire le programme évident de 5 lignes en C ...
cmpest si étroitement contrainte. L'utilisation de l' -xoption on greppour 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).
cmpserait mieuxdiffqu'ici?