Bagaimana cara RSYNC satu file?

95

Saat ini saya hanya melakukan RSync Directoriesseperti:

* * * * * rsync -avz /var/www/public_html/images root@<remote-ip>:/var/www/public_html

Jadi bagaimana saya rsyncsatu file seperti /var/www/public_html/.htaccess,?

夏 期 劇場
sumber

Jawaban:

160

Anda melakukannya dengan cara yang sama seperti yang Anda lakukan pada direktori, tetapi Anda menentukan jalur lengkap ke nama file sebagai sumbernya. Dalam contoh Anda:

rsync -avz   --progress  /var/www/public_html/.htaccess root@<remote-ip>:/var/www/public_html/

Seperti yang disebutkan dalam komentar: karena -atermasuk recurse , satu kesalahan ketik kecil dapat membuatnya memulai transfer pohon direktori penuh, jadi pendekatan yang lebih mudah ditemukan mungkin hanya menggunakan -vz, atau menggantinya dengan -lptgoD.

Michael Place
sumber
19
Juga jika Anda hanya mengirim satu file Anda mungkin ingin menambahkan parameter "--progress" sehingga Anda dapat melihat kemajuannya.
JoshStrange
apakah ini berarti Anda masih memerlukan modul di rsyncd.conf dengan direktori di atas file (misalnya dengan opsi penolakan hapus), atau dapatkah Anda mengunggah file di mana saja di server dengan hanya menentukan jalurnya? Halaman manual tidak terlalu jelas tentang itu.
3
-a termasuk rekursif dan itu tidak diperlukan untuk satu file tidak yakin apakah saya akan menggunakan bendera itu untuk file tunggal karena dapat menyebabkan perilaku yang tidak diinginkan jika nama file secara tidak sengaja menjadi direktori.
perang ulang
2
--pihak --stats --progress << Flag ini berguna jika itu adalah file yang sangat besar dan mungkin harus dilanjutkan setelah transfer rusak.
Ahi Tuna
16

Sintaks dasar

rsync options source destination

Contoh

rsync -az /var/www/public_html/filename root@<remote-ip>:/var/www/public_html

Baca lebih lajut

Techie
sumber
14

Jawaban Michael Place berfungsi dengan baik jika, relatif terhadap direktori root untuk sumber dan target, semua direktori di jalur file sudah ada.

Tetapi bagaimana jika Anda ingin menyinkronkan file dengan jalur sumber ini:

/ source-root / a / b / file

ke file dengan jalur target berikut:

/ target-root / a / b / file

dan direktori a dan b tidak ada?

Anda perlu menjalankan perintah rsync seperti berikut:

rsync -r --include="/a/" --include="/a/b/" --include="/a/b/file" --exclude="*" [source] [target]
Kenny Evitt
sumber
2
Bukankah lebih aman untuk hanya menyalin file individu ke folder yang ada atau membuat folder terlebih dahulu? Dalam kasus sinkronisasi konten folder atau folder, mari rsync membuat semua subfolder, setelah semua itu berfungsi, tetapi dalam kasus khusus ini terlalu merepotkan dan rumit parameter --include hanya untuk menyalin file individual.
Tulains Córdova
@ user1598390 Saya tidak yakin skenario apa yang Anda asumsikan, atau bayangkan, di mana ini akan menjadi kurang aman, tetapi jika Anda mencoba mengingat bentuk spesifik dari perintah ini dan Anda tidak sering melakukannya, maka ya itu mungkin kurang aman maka menyalin file tunggal. Mungkin lebih aman jika file besar, yaitu karena rsync secara otomatis menangani sebagian besar kesalahan yang dapat terjadi selama penyalinan. Untuk beberapa konteks, sintaks saya sangat berguna bagi saya karena saya telah menulis kode yang menghasilkan perintah dalam formulir ini jadi, dengan tes yang cukup yang mencakup kode yang relevan, perintah ini 'aman'.
Kenny Evitt
0

Sampai saat ini, dua jawaban tidak benar, mereka akan mendapatkan lebih dari satu file, dan yang lainnya tidak sesederhana mungkin, berikut adalah jawaban yang lebih sederhana IMO.

Yang berikut ini hanya mendapatkan satu file, tetapi Anda harus membuat direktori dest dengan mkdir. Ini mungkin opsi tercepat:

mkdir -p ./local/path/to/file
rsync user@remote:/remote/path/to/file/ -zarv --include "filename" --exclude "*" ./local/path/to/file/

Jika hanya ada satu file di / remote / path, rsync dapat membuat direktori untuk Anda jika Anda melakukan hal berikut. Ini mungkin akan memakan waktu lebih lama karena mencari lebih banyak direktori. Ditambah itu akan membuat direktori kosong untuk direktori di / remote / path yang tidak ada di ./local

cd ./local
rsync user@remote:/remote/path -zarv --include "*/" --include "filename" --exclude "*" .

Ingatlah bahwa urutan --include dan --exclude penting.

Samuel
sumber