Saya memiliki dua file dengan ukuran 124665 dan 124858 dalam byte dan ingin memeriksa apakah file1 adalah awalan dari file2 atau tidak.
files
file-comparison
tvorog
sumber
sumber
cmp
lebih baik daripada didiff
sini?cmp
melakukan perbandingan byte ke byte yang sederhana, dan kembali segera setelah ia menemukan perbedaan, sementara itudiff
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 GNUdiffutils
, maka satu opsi adalahuntuk membandingkan paling banyak 124665 byte pertama dari dua file dan melaporkan jika mereka berbeda - atau, lebih umum
sumber
$(stat -c %s file1)
ukuran dalam byte? Apakahwc
benar-benar membuka dan memproses seluruh file untuk mendapatkan jumlah byte?wc
implementasi akan mengoptimalkan kasus itu dan melakukanfstat()
(atau / danlseek(SEEK_END)
) jadi akan seefisien mungkin. Di sisi lain, itustat -c
adalah spesifik GNU.cmp
, Anda mungkin menganggap GNU-specificstat
.GNU
cmp
dapat memecahkan masalah dengan cara yang lebih mudah: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, sedangkanfile1 file2 differ
pesan pergi ke stdout.Saya menganggap bahwa versi lain
cmp
melakukan sesuatu yang serupa, tetapi saya belum memeriksanya.sumber
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 GNUcmp
adalah satu-satunya versi yang saya coba. Saya menambahkan kalimat untuk menjelaskan.file1
dan yang lain dinamaifile12
. (Atau lebih buruk lagi, bagaimana jika file kedua dinamaiEOF on file1
?) Memecahkan ini menggunakan kuatcmp
mungkin jauh lebih sulit daripada menulis program 5-line yang jelas di C ...cmp
sangat terbatas. Menggunakan-x
opsigrep
untuk mencocokkan seluruh baris akan menangani semua kecuali kasus yang paling eksotis (misalnya baris baru dalam nama file).