Jawaban:
Andaikan Anda memiliki ukuran file1dalam variabel FILE1_SZdan headimplementasi Anda mendukung opsi (non-standar) -c:
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
cmpmelakukan perbandingan byte ke byte yang sederhana, dan kembali segera setelah ia menemukan perbedaan, sementara itu diffadalah utilitas teks yang akan menggunakan algoritma yang kompleks untuk menunjukkan kepada Anda semua perbedaan antara dua file yang tidak Anda pedulikan.
Jika sistem Anda memiliki cmpperintah dari GNU diffutils, maka satu opsi adalah
cmp -n 124665 file1 file2
untuk membandingkan paling banyak 124665 byte pertama dari dua file dan melaporkan jika mereka berbeda - atau, lebih umum
cmp -n "$(wc -c < file1)" file1 file2
$(stat -c %s file1)ukuran dalam byte? Apakah wcbenar-benar membuka dan memproses seluruh file untuk mendapatkan jumlah byte?
wcimplementasi akan mengoptimalkan kasus itu dan melakukan fstat()(atau / dan lseek(SEEK_END)) jadi akan seefisien mungkin. Di sisi lain, itu stat -cadalah spesifik GNU.
cmp, Anda mungkin menganggap GNU-specific stat.
GNU cmpdapat memecahkan masalah dengan cara yang lebih mudah:
cmp file1 file2
Ada empat kemungkinan keluaran (kecuali beberapa jenis kesalahan).
Tidak ada output: file identik.
cmp: EOF on file1: file1 adalah awalan dari file2.
cmp: EOF on file2: file2 adalah awalan dari file1.
file1 file2 differ: byte NNN, line MMM: Tidak ada awalan dari yang lain.
Sayangnya ini agak canggung untuk digunakan dalam skrip, karena kasus-kasus ini tampaknya tidak dibedakan dalam kode keluar. Selain itu, EOF on file1pesan pergi ke stderr, sedangkan file1 file2 differpesan pergi ke stdout.
Saya menganggap bahwa versi lain cmpmelakukan sesuatu yang serupa, tetapi saya belum memeriksanya.
cmpbukan perintah GNU-only atau berasal di sana, itu sudah dalam versi pertama Unix di awal 70-an. The -npilihan adalah GNU spesifik sekalipun.
cmp file1 file2 2>&1 | grep EOF on file1
cmpitu adalah unik untuk GNU, hanya bahwa GNU cmpadalah satu-satunya versi yang saya coba. Saya menambahkan kalimat untuk menjelaskan.
file1dan yang lain dinamai file12. (Atau lebih buruk lagi, bagaimana jika file kedua dinamai EOF on file1?) Memecahkan ini menggunakan kuat cmpmungkin jauh lebih sulit daripada menulis program 5-line yang jelas di C ...
cmpsangat terbatas. Menggunakan -xopsi grepuntuk mencocokkan seluruh baris akan menangani semua kecuali kasus yang paling eksotis (misalnya baris baru dalam nama file).
cmplebih baik daripada didiffsini?