2013-08-28 49 views
26

Tôi đang tìm một chương trình giống như rsync sẽ tạo ra bất kỳ thư mục cha bị thiếu nào ở phía xa.rsync - tạo tất cả thư mục cha bị thiếu?

Ví dụ, nếu tôi có /top/a/b/c/d trên một máy chủ và chỉ /top/a tồn tại trên máy chủ từ xa, tôi muốn sao chép d đến máy chủ từ xa và có bc thư mục được tạo ra là tốt.

Lệnh:

rsync /top/a/b/c/d remote:/top/a/b/c 

sẽ không làm việc vì /tmp/a/b không tồn tại trên máy chủ từ xa. Và nếu nó đã tồn tại thì tập tin d sẽ được sao chép vào đường dẫn /top/a/b/c.

Điều này có thể làm gì với rsync sử dụng --include--exclude bị chuyển mạch, nhưng nó là rất có liên quan, ví dụ .:

rsync -v -r a dest:dir \ 
    --include 'a/b'  \ 
    --include 'a/b/c'  \ 
    --include 'a/b/c/d' \ 
    --include 'a/b/c/d/e' \ 
    --exclude 'a/*'  \ 
    --exclude 'a/b/*'  \ 
    --exclude 'a/b/c/*' \ 
    --exclude 'a/b/c/d/*' 

sẽ chỉ sao chép a/b/c/d/e-dest:dir/a/b/c/d/e ngay cả khi thư mục trung gian có các file. (Lưu ý - bao gồm phải đứng trước các loại trừ.)

Có bất kỳ tùy chọn nào khác không?

+0

Xem thêm [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ủ?] (Http://stackoverflow.com/questions/1636889/rsync-how-can-i-configure-it-to-create- mục tiêu-thư-on-server) – mivk

+0

có thể trùng lặp của [Làm thế nào để buộc rsync để tạo thư mục đích] (https://stackoverflow.com/questions/9242135/how-to-force-rsync-to-create-destination-folder) – user

Trả lời

4

tôi đề nghị bạn nên thực thi sự tồn tại bằng tay:

ssh [email protected] mkdir -p /top/a/b/c 
rsync /top/a/b/c/d remote:/top/a/b/c 

điều này tạo ra các thư mục đích nếu nó không tồn tại rồi.

+2

Có - đó là một cách để làm điều đó. Nhưng có vẻ như trường hợp sử dụng của tôi là một kịch bản hữu ích như vậy nên có một lệnh cho nó hoặc một số tùy chọn để rsync. – ErikR

+1

tôi không biết về bất kỳ lá cờ nào như vậy. – mnagel

13

Bạn có thể tìm kiếm

rsync -aR 

ví dụ:

rsync -a --relative /top/a/b/c/d remote:/ 

Xem thêm thủ thuật này trong other question.

+2

Tại sao lại bao gồm '-a'? Tôi khá chắc chắn nó không cần thiết. –

+1

@KennyEvitt '-a' sử dụng đệ quy ('-r') nhưng không liên quan (' -R') để' -a' vẫn cần thiết đôi khi để bảo vệ chủ sở hữu/perms ('-aR'). Bạn có thể kiểm tra nó chạy rsync là root (hoặc một người dùng khác) để xem hành vi này. – dhaupin

+1

'--relative' sẽ không _create_ thiếu thành phần thư mục ở phía xa như trong câu hỏi. – juzzlin

1

--relative không hoạt động đối với tôi vì tôi đã thiết lập khác. Có lẽ tôi chỉ không hiểu thế nào --relative công trình, nhưng tôi phát hiện ra rằng

ssh remote mkdir -p /top/a/b/c 
rsync /top/a/b/c/d remote:/top/a/b/c 

rất dễ dàng để hiểu và thực hiện công việc.

+0

'--relative' không làm việc cho bạn, bởi vì nó không có gì để làm với điều này :) – juzzlin

+0

@juzzlin Có lẽ tôi chỉ không hiểu cách làm việc --relative. ;) – andrej

1

Tôi đang tìm một giải pháp tốt hơn, nhưng tôi có vẻ phù hợp hơn khi bạn có quá nhiều thư mục con để tạo thủ công.

Đơn giản chỉ cần sử dụng cp như một bước trung gian với --parents tùy chọn

cp --parents /your/path/sub/dir/ /tmp/localcopy 
rsync [options] /tmp/localcopy/* remote:/destination/path/ 

cp --parents sẽ tạo cấu trúc cho bạn.