Bagaimana cara membedakan file besar di Linux

31

Saya mendapatkan diff: memory exhaustedkesalahan ketika mencoba untuk diff dua file 27 GB yang sebagian besar mirip pada kotak Linux dengan CentOS 5 dan 4 GB RAM. Ini adalah masalah yang diketahui, tampaknya.

Saya berharap akan ada alternatif untuk utilitas penting seperti itu, tetapi saya tidak dapat menemukannya. Saya membayangkan solusinya harus menggunakan file sementara daripada memori untuk menyimpan informasi yang dibutuhkan.

  • Saya mencoba menggunakan rdiffdan xdelta, tetapi mereka lebih baik untuk menunjukkan perubahan antara dua file, seperti tambalan, dan tidak berguna untuk memeriksa perbedaan antara dua file.
  • Sudah mencoba VBinDiff , tetapi ini adalah alat visual yang lebih baik untuk membandingkan file biner. Saya butuh sesuatu yang bisa menyalurkan perbedaan ke STDOUT seperti biasa diff.
  • Ada banyak utilitas lain seperti vimdiffitu hanya berfungsi dengan file yang lebih kecil.
  • Saya juga membaca tentang Solaris bdifftetapi saya tidak dapat menemukan port untuk Linux.

Adakah ide selain memecah file menjadi potongan-potongan kecil? Saya memiliki 40 file-file ini sehingga mencoba untuk menghindari pekerjaan memecahnya.

Tom B
sumber
xdelta versi apa yang Anda coba? xdelta3 atau xdelta1?
nmuntz
Itu versi 1.1.4. Apakah xdelta3 menyediakan fungsionalitas yang berbeda? Saya baru saja memeriksa dokumen online dan sepertinya masih menyediakan "delta".
Tom B
Lihat juga jawaban ini: unix.stackexchange.com/a/77259/27186
unhammer

Jawaban:

12

cmpmelakukan hal-hal byte-by-byte, jadi mungkin tidak akan kehabisan memori (hanya mengujinya pada dua file 7 GB) - tetapi Anda mungkin mencari lebih detail daripada daftar "file X dan Y berbeda pada byte x , baris y ". Jika kesamaan file Anda diimbangi (misalnya, file Y memiliki blok teks yang identik, tetapi tidak di lokasi yang sama), Anda dapat meneruskan offset ke cmp; Anda mungkin dapat mengubahnya menjadi sinkronisasi ulang dengan skrip kecil.

Selain itu: Jika ada orang yang mendarat di sini ketika mencari cara untuk mengonfirmasi bahwa dua struktur direktori (berisi file yang sangat besar) identik: diff --recursive --brief(atau diff -r -quntuk jangka pendek, atau bahkan mungkin diff -rq) akan berfungsi dan tidak kehabisan memori.

Felix
sumber
bagus, saya pikir -q adalah kuncinya di sini, entah bagaimana tidak memilikinya dapat memerlukan diff untuk meletakkan seluruh file (atau setidaknya seluruh baris) ke dalam memori ...
rogerdpack
7

Saya menemukan tautan ini

diff -H mungkin membantu, atau Anda dapat mencoba menginstal port textproc / 2bsd-diff yang tampaknya tidak mencoba memuat file ke dalam RAM, sehingga dapat bekerja pada file besar lebih mudah.

Saya tidak yakin apakah Anda mencoba kedua opsi itu atau apakah keduanya cocok untuk Anda. Semoga berhasil.

Jarvin
sumber
1
Apakah ini membantu siapa pun di luar sana? Bagi saya, kegagalan yang sama ...
rogerdpack
12
Untuk siapa pun yang bertanya-tanya: diff -Hadalah alias tidak berdokumen dan usang untuk diff --speed-large-files.
a3nm
1
Jawaban ini tidak membantu. Ini adalah pertanyaan linux, dan untuk menginstal 2bsd-diff Anda harus melakukan porting terlebih dahulu. Setelah Anda menemukan sumbernya . Dan menambalnya . Kemungkinan, tetapi bukan solusi yang layak.
nyov
1

Jika file identik (panjang yang sama) kecuali untuk beberapa nilai byte, Anda dapat menggunakan skrip seperti berikut ( wadalah jumlah byte per baris ke hexdump, sesuaikan dengan lebar tampilan Anda):

w=12;
while read -ru7 x && read -ru8 y;
do
  [ ".$x" = ".$y" ] || echo "$x | $y";
done 7< <(od -vw$w -tx1z FILE1) 8< <(od -vw$w -tx1z FILE2) > DIFF-FILE1-FILE2 &

less DIFF-FILE1-FILE2

Ini tidak terlalu cepat, tetapi melakukan pekerjaan.

Tino
sumber