Cách rsync nhiều thư mục nguồn


34

Tôi muốn rsync nhiều nguồn và tôi tự hỏi cách tốt nhất để đạt được điều đó.

ví dụ

/etc/fstab
/home/user/download

Tôi nghĩ về 3 giải pháp:

  • Giải pháp 1

nhiều cuộc gọi đến rsync

rsync -a /etc/fstab bkp
rsync -a /home/user/download bkp

con: khó có stat hơn

  • Giải pháp 2

tạo một tobackupthư mục chứa symlink và sử dụng -Lcác tùy chọn

sync -aL /home/user/tobackup bkp

con: nội dung để sao lưu không được chứa liên kết tượng trưng

  • Giải pháp 3

di chuyển tệp vào sao lưu và tạo symlink ở vị trí ban đầu

rsync -a /home/user/tobackup bkp

con: một số cấu hình thủ công

Bạn giới thiệu cái nào?

Có cách nào tốt hơn ?


Câu trả lời:


33

Bạn có thể truyền nhiều đối số nguồn.

rsync -a /etc/fstab /home/user/download bkp

Điều này tạo ra bkp/fstabbkp/download, giống như các lệnh riêng biệt bạn đã đưa ra. Thay vào đó, nó có thể được mong muốn để bảo tồn cấu trúc nguồn. Để làm điều này, sử dụng /làm nguồn và sử dụng các quy tắc bao gồm loại trừ để chỉ định tệp nào sẽ sao chép. Có hai cách để làm điều này:

  • Hoàn toàn bao gồm từng tệp cũng như từng thành phần thư mục dẫn đến nó, /***ở cuối thư mục khi bạn muốn sao chép toàn bộ cây thư mục:

    rsync -a \
        --include=/etc --include=/etc/fstab \
        --include=/home --include=/home/user --include='/home/user/download/***' \
        --exclude='*' / bkp
    
  • Bao gồm tất cả các thư mục cấp cao nhất với /*/(để rsync sẽ duyệt qua /etc/homekhi tìm tệp để sao chép) và thư mục cấp hai với /*/*/(cho /home/user), nhưng loại bỏ các thư mục không có tệp nào được sao chép. Điều này thuận tiện hơn vì bạn không cần phải liệt kê rõ ràng cha mẹ. Bạn thậm chí có thể sử dụng --prune-empty-dirs --include='*/'thay vì đếm số cấp, nhưng điều này không thực tế ở đây vì rsync sẽ đi qua toàn bộ hệ thống tệp để khám phá các thư mục mặc dù không có quy tắc nào có thể khớp với bất kỳ thứ gì bên ngoài /etc/home/user/download.

    rsync -a --prune-empty-dirs \
        --include='/*/' --include='/*/*/' \
        --include=/etc/fstab \
        --include='/home/user/download/***' \
        --exclude='*' / bkp
    

1
Tuyệt vời, nhưng làm thế nào để giữ cấu trúc thư mục bên trong bkp?
Rodrigo

Ý tôi là, bkp / etc / fstab và bkp / home / user / dowlonad? Hoặc có thể / bkp / fstab và bkp / download?
Rodrigo

@Rodrigo Tôi đã chỉnh sửa câu trả lời của mình
Gilles 'SO- ngừng trở nên xấu xa'

13

Tôi thực sự thích câu trả lời của Gilles, tuy nhiên, tôi muốn thêm rằng theo quan điểm của tôi, yêu cầu đồng bộ hóa nhiều thư mục trong khi bảo tồn cấu trúc thư mục được đáp ứng tốt nhất bằng cách chuyển nhiều đối số nguồn kết hợp với --relativetùy chọn.

Trong trường hợp này, chúng ta có thể có một cái gì đó như sau:

rsync -aR /etc/fstab /home/user/download bkp

mà sẽ dẫn đến bkp/etc/fstabbkp/home/user/download.

Phần tốt nhất về điều này là (tôi tin từ rsync v. 2.6.7) về bản chất chúng ta có thể kiểm soát bao nhiêu cấu trúc thư mục mà chúng ta muốn sao chép tại máy thu.
(Xem tài liệu về --relativetùy chọn ở đây )

Vì vậy, ví dụ nếu chúng ta làm điều này

rsync -aR /home/./user1/download /home/./user2/download bkp

chúng tôi sẽ kết thúc với bkp/user1/downloadbkp/user2/download.


2

Điều này cũng hoạt động - dấu ngoặc nhọn, chứa danh sách nguồn được phân tách bằng dấu phẩy.

rsync -vap --progress --stats root@server:{/etc,/root/backups,/home/ultralazer} /mnt/bigdrive

Tương tự như những gì xảy ra khi bạn gọi sytnax niềng răng bằng cp và một số tiện ích khác:

cp -vr /etc /root/backups /home/{ultralazer,zerocool} /mnt/bigdrive

Làm thế nào bạn sẽ chỉ định cổng ssh với điều này? Cú pháp đó dường như hoạt động khi sử dụng-e
tcurdt
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.