Tengo dos archivos con tamaños 124665 y 124858 en bytes y quiero verificar si file1 es un prefijo de file2 o no.
files
file-comparison
tvorog
fuente
fuente
cmp
sería mejor quediff
aquí?cmp
hace una comparación simple byte a byte y regresa tan pronto como encuentra una diferencia, mientras quediff
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 GNUdiffutils
, entonces una opción escomparar a lo sumo los primeros 124665 bytes de los dos archivos e informar si difieren, o más generalmente
fuente
$(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 unfstat()
(o / y alseek(SEEK_END)
) para que sea tan eficiente como sea posible. Por otro lado, esostat -c
es específico de GNU.cmp
, razonablemente puede suponer específico de GNUstat
.GNU
cmp
puede resolver el problema de una manera más fácil: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 elfile1 file2 differ
mensaje va a stdout.Supongo que otras versiones de
cmp
hacer algo similar, pero no lo he comprobado.fuente
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 GNUcmp
era la única versión que probé. Agregué una oración para aclarar.file1
y el otro se nombrafile12
. (O peor aún, ¿qué pasa si se nombra el segundo archivoEOF on file1
?) Resolver este uso de manera robustacmp
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óngrep
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).