Saya memiliki skrip shell di mana saya perlu memeriksa apakah dua file berisi data yang sama atau tidak. Saya melakukan ini untuk banyak file, dan dalam skrip saya diff
perintah ini tampaknya menjadi hambatan kinerja.
Inilah intinya:
diff -q $dst $new > /dev/null
if ($status) then ...
Mungkinkah ada cara yang lebih cepat untuk membandingkan file, mungkin algoritma khusus alih-alih yang default diff
?
diff
dancmp
.Jawaban:
Saya percaya
cmp
akan berhenti pada perbedaan byte pertama:sumber
cmp -s $old $new
juga berfungsi.-s
kependekan dari--silent
cmp
akan memeriksa ukuran file terlebih dahulu. Ini versi GNU, jika Anda ingin melihat optimasi tambahan yang meliputi: git.savannah.gnu.org/cgit/diffutils.git/tree/src/cmp.cSaya suka @Alex Howansky telah menggunakan 'cmp --silent' untuk ini. Tetapi saya membutuhkan respons positif dan negatif sehingga saya menggunakan:
Saya kemudian dapat menjalankan ini di terminal atau dengan ssh untuk memeriksa file terhadap file yang konstan.
sumber
echo success
perintah Anda (atau perintah apa pun yang Anda masukkan) gagal, perintah "tanggapan negatif" Anda akan dijalankan. Anda harus menggunakan konstruksi "if-then-else-fi". Misalnya, suka contoh sederhana ini .Mengapa Anda tidak mendapatkan hash dari kedua konten file?
Coba skrip ini, panggil misalnya script.sh dan kemudian jalankan sebagai berikut: script.sh file1.txt file2.txt
sumber
1/(2^511)
. Kecuali jika Anda khawatir tentang seseorang yang sengaja mencoba membuat tabrakan , ide metode ini menghasilkan false positive bukanlah masalah serius.cmp
masih lebih efisien, karena tidak harus membaca seluruh file dalam kasus di mana file tidak cocok.Karena saya payah dan tidak memiliki poin reputasi yang cukup, saya tidak dapat menambahkan berita gembira ini sebagai komentar.
Tapi, jika Anda akan menggunakan
cmp
perintah (dan tidak perlu / ingin menjadi verbose) Anda bisa ambil status keluar. Percmp
halaman manual:Jadi, Anda bisa melakukan sesuatu seperti:
sumber
cmp --silent $FILE1 $FILE2 ; if [ "$?" == "1" ]; then echo "files differ"; fi
yang pada gilirannya merupakan cara yang lebih rumit untuk dilakukancmp --silent $FILE1 $FILE2 || echo "files differ"
karena Anda dapat menggunakan perintah dalam ekspresi secara langsung. Ini menggantikan$?
. Alhasil status perintah yang ada akan dibandingkan. Dan itulah yang dilakukan jawaban lainnya. btw. Jika seseorang kesulitan--silent
, itu tidak didukung di mana-mana (busybox). gunakan-s
Untuk file yang tidak berbeda, metode apa pun akan mengharuskan membaca kedua file sepenuhnya, bahkan jika membaca dulu.
Tidak ada alternatif. Jadi membuat hashes atau checksum di beberapa titik waktu memerlukan membaca seluruh file. File besar membutuhkan waktu.
Pengambilan file metadata jauh lebih cepat daripada membaca file besar.
Jadi, adakah metadata file yang dapat Anda gunakan untuk memastikan bahwa file-file itu berbeda? Ukuran file ? atau bahkan hasil dari perintah file yang hanya membaca sebagian kecil file?
Ukuran file contoh kode fragmen:
Jika ukuran file yang sama maka Anda terjebak dengan membaca file lengkap.
sumber
ls -n
untuk menghindari masalah jika nama pengguna atau grup memiliki spasi putih.Coba juga untuk menggunakan perintah cksum:
Perintah cksum akan menampilkan jumlah byte file. Lihat 'man cksum'.
sumber
md5
membaca seluruh file, jadicmp
, berhenti pada perbedaan pertama, akan jauh lebih cepat.Melakukan beberapa pengujian dengan Raspberry Pi 3B + (Saya menggunakan sistem file overlay, dan perlu disinkronkan secara berkala), saya menjalankan perbandingan sendiri untuk diff -q dan cmp -s; perhatikan bahwa ini adalah log dari dalam / dev / shm, jadi kecepatan akses disk adalah bukan masalah:
Saya menjalankannya beberapa kali. cmp -s secara konsisten memiliki waktu yang sedikit lebih pendek pada kotak tes yang saya gunakan. Jadi jika Anda ingin menggunakan cmp -s untuk melakukan hal-hal antara dua file ....
sumber