Respuestas:
Supongamos que tiene el tamaño de file1
en la variable FILE1_SZ
y su head
implementación admite la -c
opción (no estándar) :
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
hace una comparación simple byte a byte y regresa tan pronto como encuentra una diferencia, mientras que diff
es una utilidad de texto que usará un algoritmo complejo para mostrarle todas las diferencias entre los dos archivos que no le interesan.
Si su sistema tiene el cmp
comando de GNU diffutils
, entonces una opción es
cmp -n 124665 file1 file2
comparar a lo sumo los primeros 124665 bytes de los dos archivos e informar si difieren, o más generalmente
cmp -n "$(wc -c < file1)" file1 file2
$(stat -c %s file1)
el tamaño en bytes? ¿ wc
Realmente abre y procesa todo el archivo para obtener el recuento de bytes?
wc
implementaciones optimizarán ese caso y harán un fstat()
(o / y a lseek(SEEK_END)
) para que sea tan eficiente como sea posible. Por otro lado, eso stat -c
es específico de GNU.
cmp
, razonablemente puede suponer específico de GNU stat
.
GNU cmp
puede resolver el problema de una manera más fácil:
cmp file1 file2
Hay cuatro salidas posibles (salvo algún tipo de error).
Sin salida: los archivos son idénticos.
cmp: EOF on file1
: file1 es un prefijo de file2.
cmp: EOF on file2
: file2 es un prefijo de file1.
file1 file2 differ: byte NNN, line MMM
: Ninguno de los dos es un prefijo del otro.
Desafortunadamente, esto es un poco incómodo de usar en un script, ya que estos casos no parecen distinguirse en el código de salida. Además, los EOF on file1
mensajes van a stderr, mientras que el file1 file2 differ
mensaje va a stdout.
Supongo que otras versiones de cmp
hacer algo similar, pero no lo he comprobado.
cmp
no es un comando solo de GNU ni se originó allí, ya estaba en la primera versión de Unix a principios de los años 70. Sin -n
embargo, la opción es específica de GNU.
cmp file1 file2 2>&1 | grep EOF on file1
cmp
era exclusivo de GNU, solo que GNU cmp
era la única versión que probé. Agregué una oración para aclarar.
file1
y el otro se nombra file12
. (O peor aún, ¿qué pasa si se nombra el segundo archivo EOF on file1
?) Resolver este uso de manera robusta cmp
es probablemente mucho más problema que escribir el obvio programa de 5 líneas en C ...
cmp
está muy restringida. El uso de la -x
opción grep
para que coincida con la línea completa se encargará de todos los casos menos los más exóticos (por ejemplo, nuevas líneas en el nombre del archivo).
cmp
sería mejor quediff
aquí?