Bandingkan direktori besar dengan laporan kemajuan

13

Saya baru saja rsync-ed 2.000.000 file (3TB) dari satu RAID ke yang lain.

Saya ingin memastikan data saya utuh.

rsync -c Butuh waktu sangat lama.

diff tidak menunjukkan kepada saya apa yang dilakukannya.

Apakah ada alternatif yang (a) lebih cepat, dan (b) akan menunjukkan kepada saya kemajuan sambil membandingkan?

(Saya di Mac, dan brew search diffmemberi saya apgdiff colordiff diffstat diffutils fmdiff libxdiff open-vcdiff podiff rfcdiff vbindiff bsdiff diffpdf diffuse dwdiff kdiff3 ndiff perceptualdiff rdiff-backup tkdiff wdiff ... akankah salah satu dari ini melakukan pekerjaan?)

Dan
sumber
Saya juga bingung mengapa rsyncmenyalin data sekitar 150MB / s, namun diffmembandingkan hanya 60MB / s ...?
Dan
1
Penggunaan salinan rsynclebih cepat b / c rsyncsecara default tidak menggunakan checksum untuk membandingkan file, terlihat pada ukuran dan info tanggal. Ketika Anda menggunakan rsync -csemua file harus memiliki checksum mereka dihitung yang merupakan tugas yang memberatkan, maka mengapa itu bukan default.
slm
Ya, tetapi diff tidak menyalin ... itu hanya membaca kedua file; sedangkan rsync, untuk menyalin, harus membaca setiap byte, lalu menulisnya. Ini adalah rsync dari awal, jadi ini menyalin setiap file.
Dan

Jawaban:

6

edit untuk koreksi & kejelasan opsi - Saya lupa '--brief'

diff -rs --brief "$dir1" "$dir2" 

-r, --recursive              recursively compare any subdirectories found
-s, --report-identical-files report when two files are the same
-q, --brief                  report only when files differ
--speed-large-files      assume large files and many scattered small changes

dan tambahkan opsi lain sesuai selera, tergantung pada apa yang Anda bandingkan:

-i, --ignore-case            ignore case differences in file contents
-b, --ignore-space-change    ignore changes in the amount of white space
-B, --ignore-blank-lines     ignore changes whose lines are all blank
--strip-trailing-cr      strip trailing carriage return on input
--ignore-file-name-case  ignore case when comparing file names

diff -rs akan membaca setiap byte dari dokumen asli dan menyalin, dan melaporkan file yang sama.

Format keluaran diff didefinisikan oleh POSIX, sehingga cukup portabel. Anda mungkin ingin menambahkan sesuatu seperti:

| tee diff-out.1 | grep -v -Ee 'File. * dan. * identik'

Anda bisa menggunakan chksums atau hashes, tetapi Anda harus tetap menyinkronkannya dengan pohon file, jadi Anda akan kembali membaca setiap byte dari setiap file.

EDIT - terlalu lama untuk dikomentari, sebagai tanggapan atas:

file lebih dari 10GB tidak memverifikasi

Anda mungkin ingin mencoba opsi diff ini: --speed-large-files

Mungkin saja diff yang Anda gunakan tidak cocok dengan file yang sangat besar (misalnya lebih besar dari memori sistem), dan karenanya melaporkan perbedaan antara file yang sebenarnya sama.

Saya pikir ada opsi -h atau 'bdiff' yang lebih baik pada file besar, tetapi saya tidak dapat menemukannya di Fedora. Saya percaya bahwa opsi --speed-large-files adalah penerus dari opsi '-h' "half-hearted bandingkan".

Pendekatan yang berbeda akan mengulangi perintah rsync yang Anda gunakan, dengan '-vin' (verbose, itemize, no_run). Ini akan melaporkan setiap perbedaan yang ditemukan rsync - dan seharusnya tidak ada.

Untuk memindahkan beberapa file, Anda melihat skrip sesuatu seperti:

if [ cmp -s "$dir1/$path" "$dir2/$path" ] ; then 
target="$dir2/verified/$path"
mkdir -p $(basename "$target")
mv  "$dir2/$path" "$target"
fi

tapi saya tidak menyarankan melakukan itu. Pertanyaan mendasarnya adalah "bagaimana saya bisa yakin bahwa rsync menyalin hierarki file dengan benar?" dan jika Anda dapat menunjukkan kepada diri sendiri bahwa rsync bekerja dengan baik, dengan diff atau alat lain, maka Anda bisa mengandalkan rsync, daripada mengerjakannya.

rsync -vin akan membandingkan berdasarkan opsi lain apa pun yang Anda berikan. Saya pikir itu default ke checksum, tetapi Anda benar, -c atau --checksum diperlukan untuk itu.

Utilitas diff benar-benar ditujukan untuk file baris teks, tetapi harus melaporkan under -s 'identik' untuk file biner.

--Brief harus menekan output konten file apa pun - permintaan maaf saya karena mengabaikannya sebelumnya - itu dikubur dalam skrip yang jelek.

D McKeon
sumber
Apakah ada cara untuk mendapatkannya ke mvsetiap file yang ditemukan ke folder "diverifikasi" di root drive, mempertahankan path lengkap? Misalnya, jika /disk1/a/b/c/file1identik dengan /disk2/a/b/c/file1, maka pindahkan ke /disk1/verified/a/b/c/file1. Lalu saya bisa berakhir hanya dengan file yang disalin dengan buruk. (Sejauh ini BANYAK file lebih dari 10GB tidak memverifikasi, yang menakutkan.)
Dan
Anda mungkin ingin mencoba opsi ini: --speed-large-files
D McKeon
Apa yang dilakukan dengan tepat?
Dan
Jika saya menjalankan rsync -vin- apakah itu melakukan perbandingan byte-by-byte atau checksum? Saya pikir rsync hanya membandingkan ukuran / tanggal kecuali Anda menambahkan -c. Dan dari apa yang saya baca speed large filestampaknya hanya membuat perbedaan dengan file non-biner ... atau saya salah?
Dan
diffmemberi saya hasil dalam bentuk "Files __ and ___ differ"... dan saya menjalankannya sed -e "s/Files /cp -afv /" -e "s/ and / /" -e "s/ differ$//"untuk mencoba dan menghasilkan skrip untuk menyalin ulang file yang buruk. Tetapi keluaran diff tidak dikutip, jadi tidak bekerja. Bisakah saya mendapatkannya untuk memberi saya jalur kutipan?
Dan
4

Berikut adalah difflaporan kemajuan berdasarkan jumlah file:

diff -rqs dir1 dir2 | pv -l -s filecount > logfile

Anda akan membutuhkan pv (penampil pipa): http://www.ivarch.com/programs/pv.shtml

Penjelasan:

  • diff -r membandingkan direktori dan subdirektori secara rekursif.
  • diff -qhanya cetak nama file file yang berbeda. jangan cetak perbedaan yang sebenarnya.
  • diff -scetak juga nama file file yang tidak berbeda. ini penting untuk informasi kemajuan.
  • pv -l melaporkan kemajuan berdasarkan jumlah baris.
  • pv -s count memperkirakan waktu untuk menyelesaikan berdasarkan hitungan.
  • Redirect ke logfileadalah untuk output cantik. Kalau tidak, output dari diffakan bercampur dengan garis status dari pv.

untuk mendapatkan jumlah file gunakan perintah berikut:

find dir1 -type f | wc -l

Saring file log untuk file yang berbeda:

grep -v "^Files .* identical$" logfile

Variasi ini akan mencetak file yang berbeda secara waktu nyata sambil juga mencatat semuanya logfile:

diff -rqs dir1 dir2 | pv -l -s filecount | 
    tee logfile | grep -v "^Files .* identical$"

Atau Anda dapat login hanya file yang berbeda:

diff -rqs dir1 dir2 | pv -l -s filecount | 
    grep -v "^Files .* identical$" > logfile

Catatan: perintah di atas akan melaporkan kemajuan berdasarkan jumlah file. Ini berfungsi baik jika ada banyak file bertubuh kecil. Jika Anda memiliki beberapa file besar maka Anda tidak akan bersenang-senang dengan ini.

Sayangnya saya tidak tahu cara mudah untuk melaporkan kemajuan berdasarkan byte yang dibandingkan.


Jika Anda dapat menemukan kedamaian hanya dengan membandingkan metadata (dan bukan konten sebenarnya dari file) maka Anda dapat menggunakan rsync. Ini akan jauh lebih cepat.

Untuk lebih jelasnya:

lesmana
sumber
0

Saya akan melihat menggunakan semacam aplikasi hash untuk memeriksa integritas data. Saya tahu bahwa banyak utilitas menemukan file duplikat menggunakan hash untuk mengidentifikasi duplikat / non-duplikat. Menurut saya ini investigasi yang mungkin bermanfaat.

Coder OT
sumber
0

Anda dapat menggunakan rdiff-backup untuk itu. Instal di kedua server dan itu akan melakukan perbandingan cerdas checksum dan menyinkronkan apa yang belum ada.

Timo
sumber