Bagaimana saya dapat dengan mudah mengkonfirmasi di Linux bahwa dua direktori terpisah memiliki konten yang sama persis?

8

CentOS 5.x

Mq pertanyaannya mirip dengan yang ini tapi saya tidak yakin ...

Saya memiliki dua server (sepenuhnya terisolasi satu sama lain), masing-masing dengan direktori dan sub-direktori yang harus memiliki konten yang persis sama.

Misalnya tata letak direktori bisa seperti:

SERVER A -

/opt/foo/foob/1092380298309128301283/123.txt
/opt/foo/foob/5094380298309128301283/456.txt
/opt/foo/foob/5092380298309128301283/789.txt
/opt/foo/foob/1592380298309128301283/abc.txt

SERVER B -

/opt/foo/foob/1092380298309128301283/123.txt
/opt/foo/foob/5094380298309128301283/456.txt
/opt/foo/foob/5092380298309128301283/789.txt
/opt/foo/foob/1592380298309128301283/abc.txt

Idealnya saya ingin cara melakukan pemeriksaan rekursif dan memiliki sesuatu yang mengkonfirmasi bahwa semuanya cocok.

Saya juga ingin menghindari menggunakan alat pihak ketiga.

Ada ide?

Mike B
sumber
Apakah Anda hanya ingin membandingkan kedua direktori, atau benar-benar membuat satu duplikat dari yang lain?
Scott Pack
@ScottPack Pertanyaan bagus. Saya ingin membandingkan tetapi TIDAK membuat perubahan. Sesuatu yang lain adalah menangani replikasi direktori. Saya hanya ingin memastikan itu melakukan tugasnya.
Mike B
1
Anda sudah menandai pertanyaan ini rsync? Jadi ... uhm, gunakan rsync(dengan -nopsi)?
faker
@faker Saya pikir rsync mungkin menjadi pilihan tetapi tidak yakin apakah ada sesuatu yang lebih baik, lebih mudah, atau lebih spesifik untuk use case ini. Saya perlu tahu bahwa nama file, tanggal, ukuran, dan lokasi relatif cocok.
Mike B
perhatikan bahwa rsync tidak memeriksa isi file jika waktu dan ukuran cocok, lihat opsi --checksum jika ini membuat Anda khawatir
rebus

Jawaban:

9

Salah satu cara yang baik adalah dengan menggunakan md5sums pada setiap file di pohon:

Jalankan ini di server1:

find /opt/foo/foob/ -type f -print0 | xargs -0 md5sum > report_from_server1.tx

Jalankan ini di server2

find /opt/foo/foob/ -type f -print0 | xargs -0 md5sum > report_from_server2.tx

Kemudian bandingkan saja dua file (menggunakan diff) atau apa pun yang Anda suka.

Apakah itu sejalan dengan apa yang Anda cari?

Tentu saja, Anda dapat menggunakan SSH untuk hanya menjalankan perintah dari jarak jauh jika Anda mau.

Camden S.
sumber
Terima kasih Camden. Ya, saya pikir inilah yang saya cari. Saya akan mengujinya dan melihat apakah itu berhasil.
Mike B
2
Atau md5sum md5sums
dmourati
Luar biasa - benar, jika Anda tidak ingin tahu file mana yang berubah, Anda bisa md5sum file yang dihasilkan dan membandingkan dua jumlah itu.
Camden S.
Juga, Anda mungkin sudah mengetahui hal ini, tetapi untuk mengeksekusi perintah itu dari jarak jauh melalui SSH, Anda cukup melakukannyassh user@servera 'find /opt/foo/foob/ -type f -print0 | xargs -0 md5sum'
Camden S.
1
MikeB, dengan menjalankan daftar panjang rekursif dan meneruskannya ke md5sum, Anda akan mendapatkan md5sum dari daftar direktori, yang akan mengecualikan konten file. Jika ukuran inode pada sistem file di kedua ujungnya berbeda maka bisa sangat baik membuat perbedaan dalam ukuran file juga. Melakukan md5sum pada konten seperti yang awalnya disarankan oleh @CamdenS. lebih baik.
nearora
7

Jika Anda tidak perlu peduli dengan apa yang berubah, hanya saja ada sesuatu yang berubah, rsync masih sangat bagus untuk itu. Coba jalankan perintah ini dan lihatlah hasilnya, dengan anggapan ini dijalankan dari 'servera'.

rsync -avcn /opt/foo/ serverb:/opt/foo

Daftar yang dihasilkan adalah file-file yang akan dimodifikasi jika Anda benar-benar menjalankan proses sinkronisasi. Ingatlah bahwa file akan muncul dalam daftar walaupun hanya timestamp yang diubah, tetapi isinya tetap sama. Karena kami menambahkan -nbenderanya, maka tidak ada tindakan yang akan dilakukan, hanya dilaporkan.

Scott Pack
sumber
Terima kasih. Bagaimana jika kedua kotak benar-benar terisolasi satu sama lain? Bagaimana saya bisa menggunakan output untuk membandingkan?
Mike B
rsync tidak mendukung sumber dan tujuan untuk menjadi jauh, jadi dia harus menjalankannya dari salah satu servernya
faker
@faker: Harus mengakui, tidak pernah mencobanya sebelumnya, senang tahu. Seperti yang Anda katakan, cukup mudah untuk menjelaskannya.
Scott Pack
+1. Penggunaan cerdas rsync. Agar sepenuhnya benar, Anda harus menjalankan rsynckedua arah. Artinya, Anda perlu menambahkan ini:rsync -avcn serverb:/opt/foo/ /opt/foo
Steven Monday
5

Meskipun Anda dapat meretas bersama skrip cepat yang akan menghitung hash MD5 individual untuk file individual dalam direktori, cara yang lebih baik untuk melakukannya adalah dengan menggunakan alat yang disebut md5deepyang akan secara rekursif menghitung hash dari semua file dalam direktori, dan kemudian menghasilkan mereka ke file. Kemudian dapat digunakan pada direktori lain, mengambil file hash pertama sebagai input, dan memberi Anda daftar file yang berbeda antara dua direktori.

Jadi, dengan mengambil contoh Anda, Anda akan mengikuti proses ini:

  1. Hitung hash dari direktori yang diperlukan pada Server A:

    md5deep -r /opt/foo/ > file_hashes.txt

  2. Salin file file_hashes.txtfile ke Server B untuk perbandingan.

  3. Hitung hash dari direktori yang diperlukan pada Server B, tetapi mengambil hash file dari Server A sebagai file input dengan menggunakan -xflag untuk hanya menampilkan file yang berbeda:

    md5deep -x file_hashes.txt -r /opt/foo/

Set alat md5deep merupakan bagian dari sistem manajemen paket di sebagian besar distro, dan yang hebat adalah ia mendukung sejumlah algoritma hashing yang berbeda, bukan hanya MD5. Jadi, jika Anda paranoid tentang tabrakan, Anda memiliki sejumlah alternatif yang tersedia. Alat-alat berikut merupakan bagian dari md5deep, masing-masing menyediakan algoritma hashing alternatif:

   md5deep - Compute and compare MD5 message digests
   sha1deep - Compute and compare SHA-1 message digests
   sha256deep - Compute and compare SHA-256 message digests
   tigerdeep - Compute and compare Tiger message digests
   whirlpooldeep - Compute and compare Whirlpool message digests
Richard Keller
sumber
0

Saya menggunakan teknik yang mirip dengan @ scott-pack. Ini akan memberi Anda perbedaan dua arah. Segala sesuatu yang dimulai dengan "menghapus" adalah file yang ada di server jarak jauh tetapi bukan server lokal. Setiap direktori yang terdaftar tanpa konten file apa pun adalah salah satu yang tidak memiliki perubahan. Setiap file yang terdaftar adalah file yang tidak ada di server jauh, atau versi lokal "lebih baru".

rsync -rvnac --delete /local/directory/ user@remote:/remote/directory/
David Baucum
sumber