Perintah cmp Linux: bandingkan bita dan temukan perbedaan pertama
Perintah cmp membandingkan dua berkas per bita dan, secara bawaan, melaporkan posisi perbedaan pertama. Gunakan cmp untuk memeriksa kesamaan isi atau menemukan titik awal ketidakcocokan, termasuk pada data biner. Pada GNU cmp, status keluar 0 berarti sama dalam cakupan perbandingan, 1 berarti berbeda, dan 2 berarti terjadi masalah.
Apa yang dilakukan cmp?
Cmp membaca kedua masukan dari awal, kecuali jika Anda meminta bagian awal dilewati. Perbandingan bawaan berhenti saat menemukan perbedaan dan tidak mengubah kedua berkas. Jika seluruh isi yang dibandingkan sama, cmp selesai tanpa keluaran dengan status 0.
Bita atau byte adalah satuan data, bukan selalu satu karakter yang terlihat. Sebuah karakter UTF-8 dapat memakai beberapa bita, sehingga nomor bita pada laporan bukan nomor karakter di editor teks. Untuk membaca perubahan per baris dalam teks, panduan diff dan format unified lebih sesuai.
Sintaks dasar
cmp [OPSI]... BERKAS1 [BERKAS2 [SKIP1 [SKIP2]]]
Untuk dua berkas biasa, berikan kedua jalurnya. Jika masukan kedua tidak diberikan, GNU cmp membaca masukan standar; pada terminal, ini dapat terlihat seperti perintah menunggu. SKIP1 dan SKIP2 adalah jumlah bita awal yang dilewati, dengan nilai bawaan nol. Kutip jalur yang mengandung spasi, misalnya cmp "salinan lama.bin" "salinan baru.bin".
Opsi berikut mengacu pada GNU Diffutils. Periksa cmp --version, cmp --help, dan man cmp pada sistem tujuan karena dukungan opsi dapat berbeda menurut implementasi. Nama seperti image-a.bin pada contoh harus diganti dengan berkas yang memang ada.
Penggunaan dasar cmp
Bandingkan dua berkas
Perintah berikut membandingkan isi dua berkas biner. Jika berbeda, laporan bawaan biasanya memuat nama kedua berkas, posisi bita pertama yang berbeda, dan nomor baris pada posisi tersebut. Jika salah satu berkas berakhir sementara berkas lain masih memiliki data, cmp melaporkan akhir berkas atau EOF dan status 1.
cmp image-a.bin image-b.bin
Nomor bita dan baris dimulai dari 1. Pada berkas biner, nomor baris hanya berkaitan dengan bita baris baru yang ditemukan, bukan struktur record atau objek dalam format berkas.
Periksa kesamaan tanpa keluaran biasa
Opsi -s cocok untuk skrip yang memakai status keluar, bukan membaca pesan yang dapat berbeda menurut bahasa sistem. Hasil yang tidak menampilkan pesan tetap harus diperiksa statusnya; itu tidak otomatis berarti kedua berkas sama. Jika terjadi masalah, jalankan ulang tanpa -s untuk memperoleh keterangan diagnostik.
cmp -s copy.iso original.iso
Batasi jumlah bita yang dibandingkan
Opsi GNU -n menentukan jumlah maksimum bita yang dibandingkan. Contoh ini memeriksa paling banyak 4096 bita pertama. Status 0 tidak mengatakan apa pun tentang data setelah batas tersebut dan juga tidak membuktikan bahwa kedua berkas memiliki panjang minimal 4096 bita.
cmp -n 4096 file-a file-b
Membaca posisi perbedaan pertama
Buat direktori latihan kosong, lalu jalankan contoh berikut di dalamnya. Perintah printf membuat dua berkas masing-masing berisi satu bita: A dan B. Nama first.bin dan second.bin akan ditimpa bila sudah ada.
printf 'A' > first.bin
printf 'B' > second.bin
cmp first.bin second.bin
Dengan pesan berbahasa Inggris, keluaran contoh ini adalah:
first.bin second.bin differ: char 1, line 1
Artinya, ketidakcocokan sudah ditemukan pada bita pertama di baris pertama. Label char pada keluaran ini tetap menunjukkan posisi bita, bukan karakter Unicode yang terlihat. Segera setelah cmp, printf '%s\n' "$?" menampilkan 1. Ambil status sebelum menjalankan perintah lain karena $? selalu merujuk perintah yang baru selesai. Pesan dapat diterjemahkan atau berbeda menurut implementasi; skrip sebaiknya memakai status, bukan mencocokkan teks laporan.
Opsi utama
| Opsi | Kegunaan |
|---|---|
-s, --silent |
Hilangkan keluaran biasa dan gunakan status keluar untuk mengambil keputusan. |
-l, --verbose |
Laporkan posisi bita yang berbeda dalam desimal dan nilai kedua bita dalam oktal. |
-b, --print-bytes |
Sertakan tampilan bita yang berbeda pada laporan. |
-i SKIP |
Lewati sejumlah SKIP bita awal pada kedua masukan. |
-i SKIP1:SKIP2 |
Pada GNU cmp, lewati jumlah berbeda pada masukan pertama dan kedua. |
-n LIMIT |
Bandingkan paling banyak LIMIT bita setelah bagian awal yang dilewati. |
Untuk pasangan A dan B di atas, cmp -l first.bin second.bin menunjukkan posisi 1 dengan nilai oktal 101 dan 102. Nilai itu bukan bilangan heksadesimal. Mode -l melaporkan perbedaan bita yang dapat dipasangkan; bila panjang masukan berbeda, bagian sisanya ditandai sebagai EOF, bukan daftar lengkap bita yang hilang pada sisi pendek.
Contoh praktis
Bedakan kesamaan, perubahan, dan kegagalan pada skrip
Di direktori latihan, siapkan generated.conf dengan cp first.bin generated.conf dan current.conf dengan cp second.bin current.conf. Skrip berikut menampilkan pesan berbeda untuk status 0, 1, dan masalah pelaksanaan. Cabang else tidak boleh langsung dianggap berarti berkas berbeda, karena masukan yang hilang juga masuk ke cabang tersebut.
if cmp -s generated.conf current.conf; then
printf '%s\n' 'Tidak ada perubahan'
else
status=$?
case "$status" in
1) printf '%s\n' 'Berkas berbeda' ;;
*) printf '%s\n' 'Perbandingan gagal; periksa masukan' >&2
exit "$status" ;;
esac
fi
Dengan A dan B, hasilnya Berkas berbeda. Untuk mencoba cabang sama, jalankan cp generated.conf current.conf, kemudian ulangi skrip; hasilnya Tidak ada perubahan. Kembalikan latihan dengan cp second.bin current.conf. Pada skrip ini, kedua hasil normal berakhir dengan status printf, sedangkan kegagalan perbandingan diteruskan melalui exit; jangan menganggap status seluruh skrip selalu sama dengan status cmp.
Bandingkan hanya wilayah header
Jika spesifikasi format menetapkan header sepanjang 512 bita, perintah berikut membatasi pemeriksaan ke wilayah awal itu. Gunakan berkas gambar disk yang sudah ada, bukan perangkat disk aktif, untuk percobaan ini.
cmp -n 512 disk-a.img disk-b.img
Bagian setelah bita ke-512 tidak ikut menentukan hasil. Dua berkas pendek yang sama juga dapat menghasilkan status 0, sehingga pemeriksaan panjang minimum dan validitas struktur header tetap merupakan tugas terpisah. Angka 512 di sini adalah contoh batas yang sudah diketahui, bukan ukuran header universal untuk semua format.
Lewati header sebelum membandingkan payload
Payload adalah bagian data yang hendak dibandingkan setelah header. Contoh ini melewati 4096 bita pada kedua masukan, lalu membandingkan bagian yang tersisa. Pakai hanya bila batas tersebut memang sesuai format berkas Anda.
cmp -i 4096 payload-a.bin payload-b.bin
Jika header kedua berkas berbeda ukuran, GNU cmp menerima bentuk seperti cmp -i 16:32 payload-a.bin payload-b.bin. Bentuk posisi argumen yang setara adalah cmp payload-a.bin payload-b.bin 16 32. Jumlah yang dilewati adalah bita, bukan jumlah baris atau karakter. Mengabaikan header tidak memvalidasi isinya; perubahan penting pada header bisa sengaja tidak terlihat dalam hasil ini.
Perbandingan dengan perintah terkait
| Perintah | Peran utama | Kapan digunakan |
|---|---|---|
cmp |
Perbandingan bita dan lokasi perbedaan pertama. | Dua masukan tersedia dan Anda perlu memeriksa kesamaan isi atau awal perbedaannya. |
diff |
Perbandingan per baris. | Meninjau perubahan teks yang perlu dibaca manusia. |
sha256sum |
Menghitung nilai ringkas atau hash tiap berkas secara terpisah. | Membandingkan hasil antarmesin atau dengan daftar hash acuan yang dipercaya. |
comm |
Memisahkan baris bersama dan baris unik dari masukan terurut. | Membandingkan dua daftar yang telah diurutkan dengan aturan sama. |
Cmp membandingkan data secara langsung tanpa perlu membuat nilai hash acuan terlebih dahulu. Hash lebih mudah disimpan atau dikirim saat kedua berkas tidak tersedia di tempat yang sama, tetapi hash acuan juga harus berasal dari sumber yang dipercaya. Tidak ada jaminan keaslian hanya karena dua berkas yang tidak dipercaya cocok satu sama lain.
Hal yang perlu diperhatikan
Keluaran -l dapat sangat panjang
Pada berkas besar dengan banyak perbedaan, mode -l dapat menghasilkan satu baris untuk setiap pasangan bita yang berbeda. Mulailah dari mode bawaan atau -s, lalu gunakan -n dan -i jika Anda memang hanya perlu meneliti wilayah tertentu. Pembatasan tersebut mengurangi cakupan kesimpulan yang dapat diambil.
Selalu periksa status keluar
Status 1 berarti perbedaan, sedangkan 2 pada GNU cmp berarti masalah seperti jalur tidak ada atau argumen tidak valid. Periksa jalur dan akses baca saat gagal; hasil diam dari -s bukan bukti kesamaan. Kondisi if pada contoh skrip memungkinkan status bukan nol ditangani, termasuk dalam alur shell yang memakai set -e.
Kesamaan bita tidak memvalidasi makna atau asal
Cmp tidak memeriksa tanda tangan, asal unduhan, atau keabsahan format. Hasilnya juga bukan audit izin dan kepemilikan berkas. Kesimpulan kesamaan berlaku pada data yang berhasil dibandingkan; berkas yang sedang berubah selama dibaca tidak memberi dasar yang stabil untuk menyimpulkan bahwa dua salinan tetap sama.
FAQ
Jika cmp tidak menampilkan apa pun, apakah berkas sama?
Pastikan statusnya 0. Itu berarti data yang dibandingkan sama; jika -n atau -i digunakan, kesimpulannya hanya berlaku pada cakupan tersebut.
Bagaimana melihat semua perbedaan setelah yang pertama?
Gunakan cmp -l BERKAS1 BERKAS2. Posisi ditampilkan dalam desimal dan nilai bita dalam oktal; keluaran dapat sangat panjang, dan sisa berkas yang lebih panjang dilaporkan sebagai EOF pada sisi pendek.
Bisakah cmp membandingkan teks?
Bisa, tetapi cmp membandingkan bita, termasuk perbedaan akhir baris atau pengodean. Diff lebih membantu jika Anda perlu membaca perubahan kalimat atau baris.
Apa bedanya dengan checksum?
Cmp membaca kedua masukan untuk dibandingkan secara langsung. Checksum atau hash dihitung per berkas sehingga nilai hasilnya mudah dibandingkan pada mesin atau waktu berbeda; mutu acuan tetap perlu diperhatikan.




