Jawaban:
Andaikan Anda memiliki ukuran file1
dalam variabel FILE1_SZ
dan head
implementasi 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
cmp
melakukan perbandingan byte ke byte yang sederhana, dan kembali segera setelah ia menemukan perbedaan, sementara itu diff
adalah 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 cmp
perintah 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 wc
benar-benar membuka dan memproses seluruh file untuk mendapatkan jumlah byte?
wc
implementasi akan mengoptimalkan kasus itu dan melakukan fstat()
(atau / dan lseek(SEEK_END)
) jadi akan seefisien mungkin. Di sisi lain, itu stat -c
adalah spesifik GNU.
cmp
, Anda mungkin menganggap GNU-specific stat
.
GNU cmp
dapat 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 file1
pesan pergi ke stderr, sedangkan file1 file2 differ
pesan pergi ke stdout.
Saya menganggap bahwa versi lain cmp
melakukan sesuatu yang serupa, tetapi saya belum memeriksanya.
cmp
bukan perintah GNU-only atau berasal di sana, itu sudah dalam versi pertama Unix di awal 70-an. The -n
pilihan adalah GNU spesifik sekalipun.
cmp file1 file2 2>&1 | grep EOF on file1
cmp
itu adalah unik untuk GNU, hanya bahwa GNU cmp
adalah satu-satunya versi yang saya coba. Saya menambahkan kalimat untuk menjelaskan.
file1
dan yang lain dinamai file12
. (Atau lebih buruk lagi, bagaimana jika file kedua dinamai EOF on file1
?) Memecahkan ini menggunakan kuat cmp
mungkin jauh lebih sulit daripada menulis program 5-line yang jelas di C ...
cmp
sangat terbatas. Menggunakan -x
opsi grep
untuk mencocokkan seluruh baris akan menangani semua kecuali kasus yang paling eksotis (misalnya baris baru dalam nama file).
cmp
lebih baik daripada didiff
sini?