Apakah mungkin membandingkan dua direktori dengan rsync dan hanya mencetak perbedaannya? Ada opsi kering-lari, tetapi ketika saya meningkatkan verbositas ke tingkat tertentu, setiap file dibandingkan ditampilkan.
ls -alR
dan diff
tidak ada pilihan di sini, karena ada hardlink di sumber yang membuat setiap baris berbeda. (Tentu saja, saya bisa menghapus kolom ini dengan perl.)
directory
rsync
file-comparison
chris
sumber
sumber
Jawaban:
Anda harus menjalankan sesuatu seperti
rsync -avun --delete
di kedua arah.Tetapi apa yang sebenarnya ingin Anda capai?
Perbarui :
rsync -avun --delete $TARGET $SOURCE |grep "^deleting "
akan memberi Anda daftar file yang tidak ada di direktori target."grep delet" karena setiap baris dicetak: delet ing ..file ..
rsync -avun $SOURCE $TARGET
akan memberi Anda daftar file "berbeda" (termasuk file baru).sumber
Untuk menambah jawaban Nils (bagi siapa saja yang menemukan ini melalui Google), secara default
rsync
hanya membandingkan ukuran file dan waktu modifikasi untuk mengetahui apakah ada perbedaan. (Jika berbeda, ia lebih banyak, tetapi jika sama, ia berhenti di sana.)Jika Anda ingin membandingkan konten file yang sebenarnya , bahkan untuk file yang memiliki ukuran yang sama dan waktu modifikasi terakhir, tambahkan tanda
-c
untuk memberitahursync
untuk membandingkan file menggunakan checksum.(
-u
Opsi memberi tahu rsync untuk mengabaikan file yang lebih baru$TARGET
daripada pada$SOURCE
, yang mungkin tidak Anda inginkan jika Anda membandingkan konten.)sumber
--no-group --no-owner --no-perms --no-times
atau kombinasi keduanya berdasarkan kebutuhan Anda.-a
alih-alih-a
, misalnyarsync -rlDcnv --delete $SOURCE $TARGET
--delete
ke daftar file yang hanya ada di$TARGET
Hanya untuk mereka yang kurang terbiasa dengan
rsync
:-n
: Bit yang paling penting - jangan tidak mengubah apa-apa;-rc
: bandingkan hanya konten (jika tidak gunakan-ac
);-v
: daftar file)--delete
: mencari perbedaan simetris, bukan uni-directional./
berarti "melihat ke dalam direktori, dan membandingkan isinya dengan tujuan".PS. Saya tahu ini adalah PS yang mengerikan - tetapi memang ditambahkan dengan terburu-buru. Namun demikian, saya yakin seseorang mungkin menemukan ini berguna.
PPS. Atau, seseorang juga bisa melakukannya
Jika nama file tidak mengandung baris baru, kami kemudian dapat mengurutkan kedua
*.md5
file, dandiff
mereka. (Ini hanya akan berfungsi untuk file; artinya, direktori kosong di kedua sisi tidak akan terdeteksi.)sumber
Anehnya tidak ada jawaban dalam 6 tahun menggunakan
-i
opsi atau memberikan output yang bagus jadi di sini saya akan pergi:TLDR - Tunjukkan saja padaku perintahnya
Memahami output
Berikut ini contoh outputnya:
Perhatikan karakter pertama dari setiap baris:
L
/R
Berarti file / dir hanya muncul diL
eft atauR
ight dir.X
berarti bahwa file tersebut muncul di kedua sisi, tapi tidak sama (dalam hal ini 11 karakter berikutnya memberikan info lebih lanjut.s
,t
danp
menggambarkan perbedaan s ize, t ime dan p ermissions masing - untuk info lebih lanjut mencobaman rsync
dan mencari--itemize-changes
) .Opsi tambahan yang mungkin ingin Anda gunakan
Jika Anda ingin juga membandingkan pemilik / grup / izin file tambahkan opsi
-o
/-g
/-p
masing-masing. Akhirnya perhatikan bahwa secara default rsync menganggap dua file sama jika mereka memiliki nama, waktu, dan ukuran yang sama. Ini sangat cepat dan sebagian besar kali lebih dari cukup tetapi jika Anda ingin 100% yakin tambahkan-c
juga membandingkan konten file dengan nama, waktu & ukuran yang sama.TLDR - Beri aku skrip untuk dihubungi
Ini dia. Sebut saja seperti ini
Semua opsi yang disebutkan di atas di bagian "Opsi tambahan yang ingin Anda gunakan" juga berlaku di sini.
Bagaimana cara kerjanya?
Kami memanggil rsync seperti ini:
Kami menggunakan
-i
(--itemize-changes
) untuk memberitahu rsync untuk mencetak satu baris output untuk setiap file yang berisi informasi tentang perbedaan antara dua direktori. Kita perlu-n
menekan perilaku normal rsync (yaitu mencoba menyinkronkan kedua dir dengan menyalin / menghapus file). kita juga perlu-r
bekerja secara rekursif untuk semua file / sub-dir.Kami memanggil rsync tiga kali:
Panggilan pertama : cetak file yang tidak ada di Dir_B. Kita perlu menggunakan
--ignore-existing
untuk mengabaikan file yang ada di kedua sisi.Panggilan kedua : Persis seperti sebelumnya, tetapi kami menukar urutan DIR_A / DIR_B.
Panggilan ketiga : Akhirnya kami
--existing
hanya menggunakan untuk memeriksa file yang muncul di kedua dir.sumber
--rsync-path="sudo rsync"
ke setiap perintah rsync. Kedua, saya ingin membandingkan direktori lokal dengan direktori jarak jauh. Saya menambahkan--rsh "ssh -p1234"
karena dalam kasus saya SSH berjalan pada port 1234. Kemudian saya memanggil script likediff-dirs [email protected]:/mnt/Vol1/dir1/ /localMnt/dir1 -c
.Saya mengerti dari pertanyaan Anda bahwa Anda tidak ingin menggunakan diff pada ls , tetapi Anda juga dapat menggunakan diff secara rekursif pada direktori:
sumber
Butuh beberapa kali saya mencoba untuk membuatnya bekerja. Jawaban Nils mensyaratkan bahwa
$TARGET
diakhiri dengan trailing/
, seperti dijelaskan oleh ジ ョ ー ジ.Berikut adalah versi yang secara eksplisit menambahkan trailing
/
:Ini memberikan daftar file yang ada di bawah
${SOURCE}
direktori tetapi tidak di bawah${TARGET}
direktori.Saya menggunakan di
sed
sini untuk menghapus garis depandeleting
dari garis keluaran, dan hanya mencetak garis-garis itu.Saya tidak menggunakan
rsync
opsi-c
karena membandingkan konten file akan jauh lebih lambat untuk kasus penggunaan saya, dan membandingkan hanya ukuran file dan waktu modifikasi juga tampaknya cukup dalam kasus ini. Saya tidak punya alasan untuk curiga bahwa komputer saya mengalami masalah kemiringan jam atau sesuatu yang jahat mengubah perangko waktu. Juga, hasil dari-c
tidak dapat mengubah keputusan untuk menghapus file, hanya keputusan untuk memperbarui atau menyimpan file.Saya juga menggunakan
-u
dan-a
(bukan-r
), sehingga nantinya saya dapat menggunakan kembali baris perintah dan mengubahnya untuk menyalin direktori dan file yang dipilih dari${SOURCE}
ke${TARGET}
, seperti ini:sumber
Saya punya ide lain untuk melakukan ini:
Anda dapat mencocokkan "FILEDETAIL ::" dengan output dari perintah. Anda juga dapat mengubah string "FILEDETAIL ::". "% N" adalah nama file.
-r Ini memberitahu rsync untuk menyalin direktori secara rekursif.
-n Ini membuat rsync menjalankan percobaan yang tidak membuat perubahan.
sumber