Saya ingin menggunakan rsync untuk ...
- hapus file di sisi penerima yang juga dihapus di sisi pengirim
- tidak menghapus file lain yang ada di direktori rsynced di sisi penerima
Sebagai contoh, katakanlah saya memiliki direktori local-src
:
SEBELUM: local-src
secara lokal mengandung ...
a.txt
b.txt
c.txt
direktori jarak jauh saya yang ingin saya sinkronkan ke konten local-src
disebut remote-src
.
SEBELUM: remote-src
berisi ...
a.txt
b.txt
c.txt
d.txt
README.md
Katakanlah saya menghapus beberapa file di local-src
:
SETELAH HAPUS LOKAL: local-src
secara lokal mengandung ...
c.txt
Bagaimana saya bisa menggunakan rsync dengan cara memastikan bahwa file yang dihapus di sumber juga dihapus di tujuan, tetapi tanpa menghapus file lain di tujuan. Misalnya, saya ingin yang berikut ini di tempat tujuan:
SETELAH HAPUS LOKAL: remote-src
berisi ...
c.txt
d.txt
README.md
Artinya, a.txt
dan b.txt
yang jauh dihapus juga, tetapi d.txt
dan README.txt
yang tersisa sendirian.
Apakah ada cara untuk mencapai ini dengan rsync?
EDIT: Putusannya sepertinya tidak mungkin dengan rsync. Saya ditanya mengapa saya membutuhkan ini, jadi untuk mengilustrasikan kasus penggunaan saya:
Katakanlah saya memiliki server web. Di server web itu, saya punya banyak direktori, misalkan saya punya direktori A
dan apublic_html
direktori tempat situs saya dilayani. Katakanlah saya memiliki beberapa proses otomatis yang menghasilkan file dalam direktori A
. Saya ingin rsync (atau sync menggunakan beberapa alat lainnya) file yang dihasilkan atau diperbarui di A
ke public_html
direktori, tanpa menghapus file sewenang-wenang lainnya yang mungkin berada dalam public_html
. Saya tentu saja tidak ingin rsync untuk secara tidak sengaja menghapus situs web saya.
Jika rsync bukan alat untuk pekerjaan ini, apakah orang lain tahu bagaimana saya bisa melakukan ini?
rsync
karena tidak ada cara untuk mengetahui file mana yang sudah ada di folder jauh. Anda mungkin perlu mencari alat lain.Jawaban:
Apa yang ingin Anda lakukan adalah masuk akal, tetapi menggunakan
rsync
untuk melakukannya sendiri tidak. Jadi jawabannya tidak .Alasannya sederhana:
rsync
tidak membuat riwayat apa yang ada di setiap direktori dan tidak memiliki cara untuk mengetahui apa yang perlu dihapus dan apa yang tidak. Bukan tanpa dukungan tambahan.Anda harus bertanya pada diri sendiri mengapa Anda suka melakukan ini
rsync
dan membuatnya lebih jelas. Ada program lain yang menggunakanlibrsync1.so
yang lebih cerdas.Dengan kendala santai yang tidak Anda perlukan
rsync
sendiri, Anda dapat melihat rdiff-backup :Ini menunjukkan
xx
danyy
sedang dalamb
.Ini menunjukkan
xx
danzz
sedang dalamb
.rdiff-backup
juga menyimpan direktorirdiff-backup-data
dib
sehingga Anda dapat rollback perubahan apapun, Anda harus membersihkan ini secara teratur menggunakanrdiff-backup
perintah. (Contohnya adalah dengan file lokal untuk menunjukkan data tambahan di target tidak bisa dihapus, tetapi rdiff-backup berfungsi melalui jaringan juga).Alternatif lain adalah menyiapkan beberapa sistem kontrol revisi terdistribusi (mercurial, bazaar, git). Dengan mercurial misalnya Anda dapat memiliki skrip (saya menggunakan Makefile untuk itu), yang mendorong semua perubahan ke server dan kemudian melakukan pembaruan dari file yang diperiksa di sana, abaikan file tambahan yang ada di server jauh (tetapi memiliki tidak dimasukkan di bawah kendali revisi).
Di server Anda akan melakukan:
Pada klien:
Sekarang jika Anda menghapus file pada klien dan lakukan:
File Anda dihapus dihapus di server, tetapi data lain (tidak ditambahkan ke repositori) tidak bisa dihapus.
sumber
A
, di mana beberapa proses otomatis, dan file secara otomatis dihasilkan di sana. Saya punya server web, dan saya ingin file-file di dalamnyaA
untuk disinkronkan kembali kepublic_html
direktori server web, tentu saja tanpa menghapus semua yang lain dipublic_html
folder server web. Jika ada yang punya ide untuk mencapai ini dengan alat lain, itu akan lebih dari diterima. Saya akan memperbarui pertanyaan saya untuk mencerminkan hal ini.local-src
direktori tanpa ada proses mengawasi direktori itu untuk perubahan. Mungkin ini akan sulit.rsync
bukan alat. Harap sadari bahwasync
inrsync
berasal dari sinkronisasi dan bukan itu yang ingin Anda lakukan. Dalam pengembanganrsync
fokus telah efisien (meminimalkan) transfer data. Alat-alat lain sepertirdiff-backup
(dan mungkincvsup
) telah menggunakan tekniknya untuk itu tetapi membangunnya dengan fitur tambahan.Saya tidak berpikir ini mungkin tanpa secara eksplisit mengecualikan file di sisi penerima sebagai bagian dari perintah rsync. Lihat bagian halaman manual untuk rsync: "ATURAN DAN HAPUS PER-DIREKTORI".
sumber
Jika saya mengerti dengan benar,
--exclude
mungkin itu yang Anda cari:sumber
Saya punya jawaban untuk itu. Saya pikir itu berhasil. Dan itu berhasil untuk saya. Pertama, Anda harus mem-
rsync
remote file ke file lokal. Kemudian sisi lokal berisi semua file.sekarang di sisi lokal
Kemudian Anda dapat menghapus file atau melakukan apa pun yang Anda inginkan. (Di sisi lokal). Di pertanyaan Anda, Anda menghapus file-file ini.
file yang dihapus
Setelah itu Anda dapat
rsync
file lokal ke sisi jarak jauh. Kemudian kedua belah pihak memiliki file yang sama.memberikan
file di sisi remote dan sisi lokal. (Dengan menggunakan
--delete
, itu menghapus file lain di sisi remote yang tidak cocok dengan sisi lokal ).sumber