Risposte:
Supponendo che tu abbia la dimensione di file1
nella variabile FILE1_SZ
e che l' head
implementazione supporti l' -c
opzione (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
fa un semplice confronto da byte a byte e ritorna non appena trova una differenza, mentre diff
è un'utilità di testo che utilizzerà un algoritmo complesso per mostrarti tutte le differenze tra i due file che non ti interessano.
Se il tuo sistema ha il cmp
comando da GNU diffutils
, allora un'opzione è
cmp -n 124665 file1 file2
per confrontare al massimo i primi 124665 byte dei due file e segnalare se differiscono - o, più in generale
cmp -n "$(wc -c < file1)" file1 file2
$(stat -c %s file1)
per la dimensione in byte? In wc
realtà apre ed elabora l'intero file per ottenere il conteggio dei byte?
wc
implementazioni ottimizzerà quel caso e farà un fstat()
(o / e a lseek(SEEK_END)
), quindi sarà efficiente come si arriva. D'altra parte, questo stat -c
è specifico per GNU.
cmp
, potresti ragionevolmente supporre specifiche GNU stat
.
GNU cmp
può risolvere il problema in modo più semplice:
cmp file1 file2
Esistono quattro possibili uscite (salvo una sorta di errore).
Nessun output: i file sono identici.
cmp: EOF on file1
: file1 è un prefisso di file2.
cmp: EOF on file2
: file2 è un prefisso di file1.
file1 file2 differ: byte NNN, line MMM
: Né è un prefisso dell'altro.
Sfortunatamente questo è un po 'imbarazzante da usare in uno script, dal momento che questi casi non sembrano essere distinti nel codice di uscita. Inoltre, i EOF on file1
messaggi vanno a stderr, mentre il file1 file2 differ
messaggio va a stdout.
Presumo che altre versioni di cmp
fare qualcosa di simile, ma non ho verificato.
cmp
non è un comando solo GNU né è nato lì, era già nella prima versione di Unix nei primi anni '70. L' -n
opzione è specifica per GNU però.
cmp file1 file2 2>&1 | grep EOF on file1
cmp
fosse unico per GNU, solo che GNU cmp
era l'unica versione che ho provato. Ho aggiunto una frase per chiarire.
file1
e l'altro è chiamato file12
. (O peggio ancora, cosa succede se il secondo file viene chiamato EOF on file1
?) Risolvere questo utilizzo in modo efficace cmp
è probabilmente molto più problematico che scrivere l'evidente programma a 5 righe in C ...
cmp
è così strettamente limitato. L'uso -x
dell'opzione on grep
per abbinare l'intera riga si occuperà di tutti tranne i casi più esotici (ad es. Newline nel nome del file).
cmp
sarebbe meglio didiff
qui?