Opsi Rsync --delete tidak menghapus file di direktori target

14

Saya mencoba menggunakan --deleteopsi rsyncuntuk menghapus file di direktori target yang tidak ada di direktori asli

Ini adalah perintah yang saya gunakan:

rsync -avz --ignore-existing --recursive --delete /var/www/* root@mydomaintest.com:/var/www

Jadi pertanyaan saya adalah, bagaimana saya bisa menghapus semua file di direktori target yang tidak ada di direktori asli?

pengguna2028856
sumber

Jawaban:

14

Gunakan perintah ini:

rsync --archive --verbose --compress --ignore-existing --delete /var/www/ root@mydomaintest.com:/var/www

Anda tidak perlu "*" dan tidak boleh menggunakannya juga.

Untuk mengecualikan / memasukkan file atau direktori, Anda harus menggunakan parameter ini:

--exclude 'to_exclude*'
--include 'to_include*'
AB
sumber
Oke izinkan saya mencoba ini :)
user2028856
2
Jadi apakah "*" yang menyebabkan perintah --delete tidak berfungsi?
user2028856
2
Seperti itulah tampilannya. :)
AB
3
--recursiveterlalu -a
berlebihan
1
"*" Dapat menjadi penting dalam beberapa kasus karena tidak termasuk file / direktori yang dimulai dengan "." Sebagai contoh saya menggunakannya ketika menggunakan rsync untuk menyalin direktori yang dikelola oleh git dari mesin pengembangan ke mesin produksi. Saya tidak ingin menyinkronkan direktori repositori .git, atau file seperti .gitignore, hanya pohon yang berfungsi, termasuk file di tingkat atas serta subdirektori.
sootsnoot
14

Perintah Anda tidak berfungsi karena ketika Anda menggunakan /var/www/*sebagai sumber, shell Anda sedang melakukan globbing di atasnya yaitu shell memperluas *ke semua file di direktori itu dan menyalin file satu per satu, jadi di sini file individual telah menjadi sumber daripada direktori induk.

Jadi, jika Anda menggunakan /var/www/*, maka Anda tidak perlu --recursiveopsi karena *akan menyebabkan file untuk disalin (bersama dengan direktori dengan isinya), bukan direktori induk yang berisi file. Karena alasan yang sama --deletetidak berfungsi, seperti --deleteakan menghapus file dari direktori tujuan yang tidak ada di direktori sumber , tetapi Anda menyalin file sehingga tidak menghapus file (diharapkan).

Ini akan membuat Anda lebih jelas:

/foo$ ls -l
-rw-rw-r-- 1 user user    0 Apr 16 17:56 egg
-rw-rw-r-- 1 user user    0 Apr 16 17:56 spam
drwxrwxr-x 2 user user 4096 Apr 16 18:14 test


/bar$ ls -l
-rw-rw-r-- 1 user user 0 Apr 16 17:56 egg
-rw-rw-r-- 1 user user 0 Apr 16 18:13 lion
-rw-rw-r-- 1 user user 0 Apr 16 17:56 spam


$ rsync -avz --ignore-existing --recursive --delete 
/foo/* /bar/

+ rsync -avz --ignore-existing --recursive --delete 
/foo/egg /foo/spam /foo/test /bar/

sending incremental file list
test/
test/hello

sent 173 bytes  received 39 bytes  424.00 bytes/sec
total size is 0  speedup is 0.00


/bar$ ls -l
-rw-rw-r-- 1 user user    0 Apr 16 17:56 egg
-rw-rw-r-- 1 user user    0 Apr 16 18:13 lion
-rw-rw-r-- 1 user user    0 Apr 16 17:56 spam
drwxrwxr-x 2 user user 4096 Apr 16 18:14 test

Seperti yang Anda lihat, saya telah menggunakan sumbernya karena /foo/*itu rsyncperintah yang dieksekusi adalah

rsync -avz --ignore-existing --recursive --delete /foo/egg 
/foo/spam /foo/test /bar/

dengan *membuat shell untuk memperluasnya dan menjadikan semua file satu per satu sebagai argumen sumber, bukan direktori induk secara keseluruhan (dan Anda juga tidak perlu --recursivedalam hal ini).

Jadi, jika Anda ingin membuat --deletepekerjaan, jalankan sebagai:

rsync -avz --ignore-existing --recursive --delete 
/var/www/ root@mydomaintest.com:/var/www/
heemayl
sumber
4
Penjelasan yang bagus menunjukkan masalah sebenarnya: menggunakan '*' untuk memperluas daftar sumber.
Antonio Bardazzi
Seperti tercantum dalam komentar saya pada jawaban yang diterima, tanda * dapat berguna untuk mengecualikan hal-hal seperti file dan direktori yang diawali dengan ".". Meskipun seperti yang Anda perhatikan, ini berarti file dan direktori dihapus dari tingkat atas di sumber tidak akan dihapus dari direktori tujuan. Untuk saya sendiri, saya tidak peduli apakah file tingkat atas bisa dihapus dengan benar dari tujuan, hanya file di bawah subdirektori yang penting. Menghapus subdirektori tingkat atas jauh lebih kecil daripada menambahkannya, dan saya bersedia melakukan rm -r manual pada tujuan dalam kasus yang tidak biasa itu.
sootsnoot