Jawaban:
Jika Anda memiliki lebih dari direktori leaf terakhir yang harus dibuat, Anda dapat menjalankan terpisah ssh ... mkdir -p
terlebih dahulu, atau menggunakan --rsync-path
trik 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 --relative
opsi 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 --relative
memulai:
rsync -a --relative /new/x/./y/z/ user@remote:/pre_existing/dir/
akan membuat / pre_existing / dir / y / z /.
&&
?
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
rsync
, oleh karena itu, tidak ada jawaban.
ssh
tidak didukung dan rsync
terhubung ke rsync daemon
pada ujung jarak jauh.
The -R, --relative
pilihan akan melakukan hal ini.
Sebagai contoh: jika Anda ingin membuat cadangan /var/named/chroot
dan membuat struktur direktori yang sama pada server jauh maka -R
akan melakukan hal itu.
/./
di jalur sumber. Lihat halaman manual untuk detailnya.
rsync
tidak akan membuat direktori secara otomatis jika folder target tidak ada. Mendesah.
--relative
. Mungkin tidak melakukan apa yang Anda pikirkan.
--relative
dalam 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.
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.
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
rsync /dev/null node:existing-dir/new-dir/
saran di atas.
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 myappdata
direktori untuk Anda di mesin jarak jauh untuk menempatkan file Anda. Sekali lagi, data/
direktori harus ada di mesin jarak jauh.
Kebetulan, saya menggunakan -rvv
flag 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 user@remote.machine:/tmp/newdir/
opening connection using: ssh -l user remote.machine rsync --server -vvre.iLsf . /tmp/newdir/
user@remote.machine'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.
rsync -rvv /path/to/data/myappdata user@host:/remote/path/to/data/myappdata
tetapi apa yang dibuat pada target adalah / remote / path / to / data / myappdata / myappdata /
rsync -rvv /path/to/data/myappdata/ user@host:/remote/path/to/data/myappdata
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.