Cara terbaik untuk membandingkan (berbeda) struktur direktori lengkap?

29

Apa cara terbaik untuk membandingkan struktur direktori?

Saya memiliki utilitas cadangan yang menggunakan rsync . Saya ingin memberi tahu perbedaan yang tepat (dalam hal ukuran file dan tanggal terakhir diubah) antara sumber dan cadangan.

Sesuatu seperti:

Local file                   Remote file                         Compare
/home/udi/1.txt (date)(size)   /home/udi/1.txt (date)(size)     EQUAL
/home/udi/2.txt (date)(size)   /home/udi/2.txt (date)(size)     DIFFERENT

Tentu saja, alat ini bisa jadi siap pakai atau ide untuk skrip python.

Terimakasih banyak!

Udi

Adam Matan
sumber

Jawaban:

18

Alat yang Anda cari adalah rdiff . Ia bekerja seperti menggabungkan rsync dan diff. Ini menciptakan file tambalan yang dapat Anda bandingkan, atau distribusikan.

brianegge
sumber
9

Beberapa orang ingin membandingkan sistem file untuk alasan yang berbeda, jadi saya akan menulis di sini apa yang saya inginkan dan bagaimana saya melakukannya.

Aku ingin:

  • Untuk membandingkan sistem file yang sama dengan dirinya sendiri, yaitu, snapshot , buat perubahan , snapshot , bandingkan .
  • Daftar file apa yang ditambahkan atau dihapus, tidak peduli dengan perubahan file bagian dalam.

Apa yang saya lakukan:

Cuplikan pertama ( before.shskrip):

find / -xdev | sort > fs-before.txt

Cuplikan kedua ( after.shskrip):

find / -xdev | sort > fs-after.txt

Untuk membandingkannya ( diff.shskrip):

diff -daU 0 fs-before.txt fs-after.txt | grep -vE '^(@@|\+\+\+|---)'

Bagian baiknya adalah ini menggunakan cukup banyak binari sistem default. Setelah itu membandingkan berdasarkan konten bisa dilakukan lewat findsebuah -execparameter yang menggema path file dan MD5 setelah itu.

Camilo Martin
sumber
8

jika Anda tidak ingin menginstal alat lain ...

for host in host1 host2
do
  ssh $host ' 
  cd /dir &&
  find . |
  while
    read line
  do
    ls -l "$line"
  done ' | sort  > /tmp/temp.$host.$$
done
diff /tmp/temp.*.$$ | less
echo "don't forget to clean up the temp files!"

Dan ya, itu bisa dilakukan dengan find dan exec atau find dan xargs semudah menemukan dalam for loop. Dan, juga, Anda dapat meningkatkan output dari diff sehingga dikatakan hal-hal seperti "file ini ada di host1 tetapi bukan host2" atau semacamnya tetapi pada saat itu Anda mungkin juga cukup menginstal alat yang orang lain bicarakan ...

chris
sumber
5

Saya telah menggunakan dirdiff di masa lalu untuk membandingkan struktur direktori. Ini hanya berfungsi pada direktori lokal sehingga Anda harus sshfs-mount direktori lain Anda.

Hal baiknya adalah Anda dapat melihat secara visual apakah file-file tersebut sama atau tidak dan mana yang lebih baru atau lebih lama. Dan ini mendukung hingga 5 direktori. Anda juga dapat melihat perbedaan dan menyalin file dari satu ke yang lain.

chmeee
sumber
4

Dari halaman manual rsync:

-n, --dry-run
This  makes rsync perform a trial run that doesn’t make any changes (and produces mostly
the same output as a real run).  It is most commonly used in combination  with  the  -v,
--verbose  and/or -i, --itemize-changes options to see what an rsync command is going to
do before one actually runs it.

Mungkin ini akan membantu.

Saurabh Barjatiya
sumber
Terima kasih, tetapi itu tidak menyelesaikan masalah saya (saya sedang mencari diff untuk benar-benar membedakannya).
Adam Matan
4

diff -rsebenarnya berfungsi cukup baik. Jika Anda hanya ingin tahu apakah file berbeda, bukan isi perbedaan sebenarnya, maka lakukandiff -qr

AlexB
sumber
1
-rberarti rekursif, itu tidak terhubung ke host jarak jauh!
Michael Hampton
3

Saya akan menggunakan Meld untuk itu.

pupeno
sumber
Meld bekerja sangat baik untuk ini jika Anda menginginkan solusi GUI.
Drew Noakes
2

Selain alat yang telah disebutkan di windows Anda dapat menggunakan Total Commander atau WinSCP, keduanya memiliki fungsi yang sangat nyaman untuk membandingkan (dan menyinkronkan) direktori.


sumber
0

Saya tidak benar-benar ingin menginstal sesuatu yang baru, jadi solusi saya agak kasar, tetapi cepat dan efektif.

Saya ingin membandingkan semua file yang telah disalin dan mode file mereka, kepemilikan dan konteks keamanan SELinux tetap tidak terkendali.

Jadi saya berlari:

rsync -aX /orig /copy/

dan kemudian bandingkan seperti ini:

cd /orig && ls -lZR > /tmp/diff_orig
cd /copy && ls -lZR > /tmp/diff_copy
vimdiff /tmp/diff_*

Jika konten kedua file tetap diciutkan maka mereka identik. Jika tidak, perbedaan ditampilkan.

Perbarui parameter lsuntuk mencerminkan atribut yang perlu Anda periksa. YMMV

helvete
sumber