rsync: bagaimana saya bisa mengkonfigurasinya untuk membuat direktori target di server?

143

Saya ingin rsyncdari komputer lokal ke server. Pada direktori yang tidak ada, dan saya ingin rsyncmembuat direktori itu di server terlebih dahulu.

Bagaimana saya bisa melakukan itu?

Uhk
sumber

Jawaban:

161

Jika Anda memiliki lebih dari direktori leaf terakhir yang harus dibuat, Anda dapat menjalankan terpisah ssh ... mkdir -pterlebih dahulu, atau menggunakan --rsync-pathtrik seperti yang dijelaskan di sini :

rsync -a --rsync-path="mkdir -p /tmp/x/y/z/ && rsync" $source user@remote:/tmp/x/y/z/

Atau gunakan --relativeopsi seperti yang disarankan oleh Tony. Dalam hal ini, Anda hanya menentukan akar tujuan, yang harus ada, dan bukan struktur direktori sumber, yang akan dibuat:

rsync -a --relative /new/x/y/z/ user@remote:/pre_existing/dir/

Dengan cara ini, Anda akan berakhir dengan / pre_existing / dir / new / x / y / z /

Dan jika Anda ingin "y / z /" dibuat, tetapi tidak di dalam "baru / x /", Anda dapat menambahkan di ./mana Anda ingin --relativememulai:

rsync -a --relative /new/x/./y/z/ user@remote:/pre_existing/dir/

akan membuat / pre_existing / dir / y / z /.

mivk
sumber
2
Server yang saya akses tidak punya mkdir, jadi saya menggunakan hack: --rsync-path="echo f > /public/.keep && rsync /public/.keep /public/newfolder/ && rsync" \itu membuat file tambahan tetapi Anda dapat menghapus nanti.
Fabiano Soriani
1
Tampaknya ini tidak berfungsi pada protokol rsync yang lebih baru, saya mendapatkan kesalahan yang mirip dengan mengikuti saat menggunakan && atau; di --rsync-path karakter yang tidak valid dalam perintah scp! di sini: && / usr / bin / rsync
ghitesh
@ Ghitesh apakah Anda mencoba melarikan diri &&?
Felipe Alvarez
@FelipeAlvarez Ya saya lakukan, tetapi tidak berhasil. Saya tidak dapat menemukan tautannya sekarang, tetapi beberapa dokumentasi mengatakan ini sudah diperbaiki, karena saya percaya itu bisa (dan sedang) dieksploitasi.
ghitesh
Terima kasih, ini berhasil. Dalam kasus saya, saya menjalankan skrip bash lokal pada server jauh dan dalam menjalankan perintah ssh mkdir yang sedang mengeksekusi, tetapi kemudian membunuh sisa skrip sebelum menjalankan perintah rsync. Ini memungkinkan sisa skrip dijalankan tanpa masalah.
johndavid400
33

Dengan asumsi Anda menggunakan ssh untuk menghubungkan rsync, bagaimana dengan mengirim perintah ssh sebelumnya:

ssh user@server mkdir -p existingdir/newdir

jika sudah ada, tidak ada yang terjadi

Alfredo Yong
sumber
4
permintaan ufk adalah untuk sintaks yang akan menyebabkan "rsync membuat direktori [target yang hilang] di server [&& salin file]." Respons Anda valid karena akan membuat direktori target yang hilang di server ... tetapi tidak dengan rsync, oleh karena itu, tidak ada jawaban.
TomRoche
Ini bukan opsi jika sshtidak didukung dan rsyncterhubung ke rsync daemonpada ujung jarak jauh.
Krzysztof Jabłoński
19

The -R, --relativepilihan akan melakukan hal ini.

Sebagai contoh: jika Anda ingin membuat cadangan /var/named/chrootdan membuat struktur direktori yang sama pada server jauh maka -Rakan melakukan hal itu.

Tony
sumber
12
Anda juga dapat menentukan hanya bagian dari jalur yang akan dibuat dengan menggunakan /./di jalur sumber. Lihat halaman manual untuk detailnya.
Marki555
20
Mengapa merasa jengkel? Jawabannya salah, rsynctidak akan membuat direktori secara otomatis jika folder target tidak ada. Mendesah.
zeekvfu
3
Saya sangat menyarankan pembaca untuk memeriksa halaman manual --relative. Mungkin tidak melakukan apa yang Anda pikirkan.
FiloSottile
3
- Relatif menempel path lengkap, bukan file, pada titik akhir yang Anda berikan di server. Biasanya /tmp/foo/bar/file.c ke remote: / tmp akan menghasilkan remote: /tmp/file.c tetapi dengan -R ia menciptakan /tmp/foo/bar/file.c Jangan gunakan opsi ini kecuali jika Anda tahu apa yang Anda lakukan, Anda akan mendapatkan struktur direktori yang benar-benar berantakan.
Cormac Mulhall
7
Komentar @ Marki555 adalah kunci kesuksesan. --relativedalam hubungannya dengan /./apa yang kebanyakan pemula akan cari. rsync -avz -e ssh --progress --relative ~/./Desktop/ TARGET_IP:~/akan menyalin konten desktop ke desktop target. Tidak tahu bagaimana perbedaan dalam nama pengguna dapat memengaruhi ini.
Daniel F
15

ini bekerja untuk saya:

 rsync /dev/null node:existing-dir/new-dir/

Saya menerima pesan ini:

skipping non-regular file "null"

tapi saya tidak perlu khawatir memiliki direktori kosong yang berkeliaran.

kdubs
sumber
Terima kasih atas jawabannya kdubs. Itu bekerja dengan baik. Jadi, jika saya ingin menyimpan file yang saya sinkronkan di dalam folder yang saya tunjuk sebagai sumber, maka saya hanya perlu menentukannya, dan file itu akan dibuat. ex: rsync -avph / mytest / / otherfolder / mytest / Lalu saya mendapatkan output "direktori buatan / otherfolder / mytest"
mbrinson
1
Jangan lupa slash ('/') di akhir dir-baru, jika tidak akan membuat file non-direktori.
tartaruga_casco_mole
4

Saya tidak berpikir Anda bisa melakukannya dengan satu perintah rsync, tetapi Anda dapat 'membuat-pre' direktori tambahan terlebih dahulu seperti ini:

rsync --recursive emptydir/ destination/newdir

di mana 'blankdir' adalah direktori kosong lokal (yang mungkin harus Anda buat sebagai direktori sementara terlebih dahulu).

Ini sedikit peretasan, tapi berhasil untuk saya.

Bersulang

Chris

Chris Dennis
sumber
Tidak perlu menggunakan folder sementara. Lihat rsync /dev/null node:existing-dir/new-dir/saran di atas.
lucid_dreamer
3

Jawaban ini menggunakan sedikit jawaban lain, tetapi semoga akan sedikit lebih jelas mengenai keadaan. Anda tidak pernah menentukan apa yang Anda rsyncing - entri direktori tunggal atau banyak file.

Jadi mari kita asumsikan Anda memindahkan entri direktori sumber, dan tidak hanya memindahkan file yang terkandung di dalamnya.

Katakanlah Anda memiliki direktori yang dipanggil secara lokal data/myappdata/dan Anda memiliki banyak subdirektori di bawahnya. Anda memiliki data/pada mesin target Anda tetapi tidak data/myappdata/- ini cukup mudah:

rsync -rvv /path/to/data/myappdata/ user@host:/remote/path/to/data/myappdata

Anda bahkan dapat menggunakan nama lain untuk direktori jarak jauh:

rsync -rvv --recursive /path/to/data/myappdata user@host:/remote/path/to/data/newdirname

Jika Anda hanya memindahkan beberapa file dan tidak memindahkan entri direktori yang berisi mereka, maka Anda akan melakukannya:

rsync -rvv /path/to/data/myappdata/*.txt user@host:/remote/path/to/data/myappdata/

dan itu akan membuat myappdatadirektori untuk Anda di mesin jarak jauh untuk menempatkan file Anda. Sekali lagi, data/direktori harus ada di mesin jarak jauh.

Kebetulan, saya menggunakan -rvvflag adalah untuk mendapatkan output verbose ganda sehingga jelas tentang apa yang dilakukannya, serta perilaku rekursif yang diperlukan.

Hanya untuk menunjukkan kepada Anda apa yang saya dapatkan ketika menggunakan rsync (3.0.9 di Ubuntu 12.04)

$ rsync -rvv *.txt [email protected]:/tmp/newdir/
opening connection using: ssh -l user remote.machine rsync --server -vvre.iLsf . /tmp/newdir/
[email protected]'s password:
sending incremental file list
created directory /tmp/newdir
delta-transmission enabled
bar.txt
foo.txt
total: matches=0  hash_hits=0  false_alarms=0 data=0

Semoga ini mengatasinya sedikit.

Mandible79
sumber
Ini tidak persis bekerja seperti yang diharapkan. Saya mencoba perintah pertama rsync -rvv /path/to/data/myappdata user@host:/remote/path/to/data/myappdatatetapi apa yang dibuat pada target adalah / remote / path / to / data / myappdata / myappdata /
harleygolfguy
Jika saya membuat sedikit perubahan pada perintah pertama Anda dan menambahkan garis miring '/' setelah jalur sumber, maka itu berfungsi ... seperti itu: rsync -rvv /path/to/data/myappdata/ user@host:/remote/path/to/data/myappdata
harleygolfguy
2

misalnya:

dari: /xxx/a/b/c/d/e/1.html

to: user @ remote: /pre_existing/dir/b/c/d/e/1.html

rsync:

cd / xxx / a / && rsync -auvR b / c / d / e / user @ remote: / pre_existing / dir /

Montase
sumber