Câu trả lời:
Nếu bạn có nhiều hơn thư mục lá cuối cùng được tạo, bạn có thể chạy riêng ssh ... mkdir -p
trước hoặc sử dụng --rsync-path
thủ thuật như được giải thích ở đây :
rsync -a --rsync-path="mkdir -p /tmp/x/y/z/ && rsync" $source user@remote:/tmp/x/y/z/
Hoặc sử dụng --relative
tùy chọn theo đề xuất của Tony. Trong trường hợp đó, bạn chỉ xác định gốc của đích, phải tồn tại chứ không phải cấu trúc thư mục của nguồn sẽ được tạo:
rsync -a --relative /new/x/y/z/ user@remote:/pre_existing/dir/
Bằng cách này, bạn sẽ kết thúc với / pre_ex hiện tại / dir / new / x / y / z /
Và nếu bạn muốn tạo "y / z /", nhưng không bên trong "new / x /", bạn có thể thêm vào ./
nơi bạn muốn --relative
bắt đầu:
rsync -a --relative /new/x/./y/z/ user@remote:/pre_existing/dir/
sẽ tạo / pre_ex hiện / dir / y / z /.
&&
?
Giả sử bạn đang sử dụng ssh để kết nối rsync, điều gì sẽ gửi lệnh ssh trước:
ssh user@server mkdir -p existingdir/newdir
nếu nó đã tồn tại, không có gì xảy ra
rsync
do đó, không có câu trả lời.
ssh
không được hỗ trợ và rsync
kết nối với rsync daemon
đầu cuối từ xa.
Các -R, --relative
tùy chọn sẽ làm điều này.
Ví dụ: nếu bạn muốn sao lưu /var/named/chroot
và tạo cấu trúc thư mục tương tự trên máy chủ từ xa thì -R
sẽ làm điều đó.
/./
trong đường dẫn nguồn. Xem trang người đàn ông để biết chi tiết.
rsync
sẽ không tự động tạo thư mục nếu thư mục đích không tồn tại. Thở dài.
--relative
. Nó có thể không làm những gì bạn nghĩ.
--relative
kết hợp với /./
là những gì hầu hết người mới sẽ tìm kiếm. rsync -avz -e ssh --progress --relative ~/./Desktop/ TARGET_IP:~/
sẽ sao chép nội dung của máy tính để bàn vào máy tính để bàn. Không biết sự khác biệt trong tên người dùng có thể ảnh hưởng đến điều này.
điều này làm việc cho tôi:
rsync /dev/null node:existing-dir/new-dir/
Tôi nhận được tin nhắn này:
skipping non-regular file "null"
nhưng tôi không phải lo lắng về việc có một thư mục trống treo xung quanh.
Tôi không nghĩ bạn có thể làm điều đó với một lệnh rsync, nhưng bạn có thể 'tạo trước' thư mục bổ sung đầu tiên như thế này:
rsync --recursive emptydir/ destination/newdir
trong đó 'blankdir' là một thư mục trống cục bộ (trước tiên bạn có thể phải tạo như một thư mục tạm thời).
Đó là một chút hack, nhưng nó hoạt động với tôi.
chúc mừng
Chris
rsync /dev/null node:existing-dir/new-dir/
gợi ý ở trên.
Câu trả lời này sử dụng các bit của các câu trả lời khác, nhưng hy vọng nó sẽ rõ ràng hơn một chút về hoàn cảnh. Bạn không bao giờ chỉ định những gì bạn đã rsyncing - một mục nhập thư mục hoặc nhiều tệp.
Vì vậy, giả sử bạn đang di chuyển một mục nhập thư mục nguồn, và không chỉ di chuyển các tệp có trong đó.
Giả sử bạn có một thư mục được gọi cục bộ data/myappdata/
và bạn có vô số thư mục con bên dưới này. Bạn có data/
trên máy mục tiêu của mình nhưng không data/myappdata/
- điều này đủ dễ:
rsync -rvv /path/to/data/myappdata/ user@host:/remote/path/to/data/myappdata
Bạn thậm chí có thể sử dụng một tên khác cho thư mục từ xa:
rsync -rvv --recursive /path/to/data/myappdata user@host:/remote/path/to/data/newdirname
Nếu bạn chỉ di chuyển một số tệp và không di chuyển mục nhập thư mục chứa chúng thì bạn sẽ làm:
rsync -rvv /path/to/data/myappdata/*.txt user@host:/remote/path/to/data/myappdata/
và nó sẽ tạo myappdata
thư mục cho bạn trên máy từ xa để đặt các tệp của bạn. Một lần nữa, data/
thư mục phải tồn tại trên máy từ xa.
Ngẫu nhiên, việc sử dụng -rvv
cờ của tôi là để có được đầu ra dài gấp đôi để rõ ràng về những gì nó làm, cũng như hành vi đệ quy cần thiết.
Chỉ để cho bạn thấy những gì tôi nhận được khi sử dụng rsync (3.0.9 trên 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
Hy vọng điều này sẽ làm rõ điều này một chút.
rsync -rvv /path/to/data/myappdata user@host:/remote/path/to/data/myappdata
nhưng những gì nó tạo ra trên mục tiêu là / remote / path / to / data / myappdata / myappdata /
rsync -rvv /path/to/data/myappdata/ user@host:/remote/path/to/data/myappdata
mkdir
, vì vậy tôi đang sử dụng hack:--rsync-path="echo f > /public/.keep && rsync /public/.keep /public/newfolder/ && rsync" \
nó tạo ra một tệp bổ sung nhưng bạn có thể xóa sau.