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

cmpsería mejor quediffaquí?cmphace una comparación simple byte a byte y regresa tan pronto como encuentra una diferencia, mientras quediffes 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
cmpcomando 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? ¿wcRealmente abre y procesa todo el archivo para obtener el recuento de bytes?wcimplementaciones 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 -ces específico de GNU.cmp, razonablemente puede suponer específico de GNUstat.GNU
cmppuede 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 file1mensajes van a stderr, mientras que elfile1 file2 differmensaje va a stdout.Supongo que otras versiones de
cmphacer algo similar, pero no lo he comprobado.fuente
cmpno 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-nembargo, la opción es específica de GNU.cmp file1 file2 2>&1 | grep EOF on file1cmpera exclusivo de GNU, solo que GNUcmpera la única versión que probé. Agregué una oración para aclarar.file1y el otro se nombrafile12. (O peor aún, ¿qué pasa si se nombra el segundo archivoEOF on file1?) Resolver este uso de manera robustacmpes probablemente mucho más problema que escribir el obvio programa de 5 líneas en C ...cmpestá muy restringida. El uso de la-xopcióngreppara 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).