rsync: làm thế nào tôi có thể cấu hình nó để tạo thư mục đích trên máy chủ?


143

Tôi muốn rsynctừ máy tính cục bộ đến máy chủ. Trên một thư mục không tồn tại và tôi muốn rsynctạo thư mục đó trên máy chủ trước.

Làm thế nào tôi có thể làm điều đó?

Câu trả lời:


161

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 -ptrước hoặc sử dụng --rsync-paththủ 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 --relativetù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 --relativebắt đầu:

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

sẽ tạo / pre_ex hiện / dir / y / z /.


2
Máy chủ tôi đang truy cập không có 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.
Fabiano Soriani 7/10/2015

1
Điều này dường như không hoạt động trên các giao thức rsync mới hơn, tôi gặp lỗi tương tự như sau khi sử dụng && hoặc; trong --rsync-path ký tự không hợp lệ trong lệnh scp! tại đây: && / usr / bin / rsync
ghitesh

@ghitesh bạn đã cố gắng để thoát khỏi &&?
Felipe Alvarez

@FelipeAlvarez Vâng, tôi đã làm, nhưng không hoạt động. Tôi không thể tìm thấy liên kết bây giờ, nhưng một số tài liệu cho biết điều này đã được sửa, vì tôi tin rằng nó có thể (và đã) được khai thác.
ghitesh

Cảm ơn, điều này làm việc. Trong trường hợp của tôi, tôi đang chạy một tập lệnh bash cục bộ trên một máy chủ từ xa và trong đó đang chạy lệnh ssh mkdir đang thực thi, nhưng sau đó giết phần còn lại của tập lệnh trước khi chạy lệnh rsync. Điều này cho phép phần còn lại của tập lệnh chạy mà không có vấn đề.
johndavid400

33

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


4
Yêu cầu của ufk là cú pháp sẽ khiến thư mục "rsync tạo thư mục [thiếu mục tiêu] trên máy chủ [&& sao chép các tệp]." Phản hồi của bạn hợp lệ ở chỗ nó sẽ tạo thư mục đích bị thiếu trên máy chủ ... nhưng rsyncdo đó, không có câu trả lời.
TomRoche

Đây không phải là một tùy chọn nếu sshkhông được hỗ trợ và rsynckết nối với rsync daemonđầu cuối từ xa.
Krzysztof Jabłoński

19

Các -R, --relativetùy chọn sẽ làm điều này.

Ví dụ: nếu bạn muốn sao lưu /var/named/chrootvà tạo cấu trúc thư mục tương tự trên máy chủ từ xa thì -Rsẽ làm điều đó.


12
Bạn cũng có thể chỉ định một phần của đường dẫn sẽ được tạo bằng cách sử dụng /./trong đường dẫn nguồn. Xem trang người đàn ông để biết chi tiết.
Marki555

20
Tại sao upvote? Câu trả lời là sai, rsyncsẽ không tự động tạo thư mục nếu thư mục đích không tồn tại. Thở dài.
zeekvfu

3
Tôi đề nghị độc giả kiểm tra trang web cho --relative. Nó có thể không làm những gì bạn nghĩ.
FiloSottile

3
--relative dính đường dẫn đầy đủ, thay vì tệp, tại điểm cuối bạn cung cấp trên máy chủ. Thông thường /tmp/foo/bar/file.c sang remote: / tmp sẽ tạo từ xa: /tmp/file.c nhưng với -R, nó tạo /tmp/foo/bar/file.c Đừng sử dụng tùy chọn này trừ khi bạn biết những gì bạn đang làm, bạn sẽ nhận được một cấu trúc thư mục thực sự lộn xộn.
Cormac Mulhall

7
Nhận xét của @ Marki555 là chìa khóa thành công. --relativekế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.
Daniel F

15

đ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.


Cảm ơn câu trả lời kdub. Điều đó đã làm việc tuyệt vời. Vì vậy, nếu tôi muốn giữ các tệp tôi đang đồng bộ hóa trong thư mục mà tôi đang trỏ đến làm nguồn, thì tôi chỉ cần chỉ định nó và nó sẽ được tạo. ví dụ: rsync -avph / mytest / / otherfolder / mytest / Sau đó, tôi nhận được đầu ra "tạo thư mục / otherfolder / mytest"
mbrinson

1
Đừng quên dấu gạch chéo ('/') ở cuối thư mục mới, nếu không nó sẽ tạo một tệp không có thư mục.
tartaruga_casco_mole

4

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


Không cần sử dụng thư mục tạm thời. Xem rsync /dev/null node:existing-dir/new-dir/gợi ý ở trên.
lucid_dreamer

3

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 myappdatathư 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 -rvvcờ 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.


Điều này không chính xác làm việc như mong đợi. Tôi đã thử lệnh đầu tiên rsync -rvv /path/to/data/myappdata user@host:/remote/path/to/data/myappdatanhưng những gì nó tạo ra trên mục tiêu là / remote / path / to / data / myappdata / myappdata /
harleygolfguy

Nếu tôi thực hiện một thay đổi nhỏ cho lệnh đầu tiên của bạn và thêm dấu gạch chéo '/' sau đường dẫn nguồn, thì nó hoạt động ... như vậy: rsync -rvv /path/to/data/myappdata/ user@host:/remote/path/to/data/myappdata
harleygolfguy

2

ví dụ:

từ: /xxx/a/b/c/d/e/1.html

đến: user @ remote: /pre_ex hiện / dir / b / c / d / e / 1..html

rsync:

cd / xxx / a / && rsync -auvR b / c / d / e / user @ remote: / pre_ex hiện / dir /

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.