Trong một rsync, làm cách nào để loại trừ tất cả các thư mục khớp với một mẫu?


8

Trong một rsync, tôi đang cố gắng loại trừ các thư mục con phù hợp với một mẫu. Nhưng, tôi không thể làm cho nó hoạt động. Tôi đã theo dõi một số ví dụ được tìm thấy ở đây và trên Google. Nhưng, tôi không nhận được kết quả chính xác. Đây là bit tùy chọn của lệnh của tôi:

-avh --exclude 'branch*' --stats --delete --link-dest=$LNK

Cấu trúc thư mục nguồn của tôi là

/root
    /branch1
    /branch2
    /branch3
    /other
    /stillAnother
    /etc

Đây là một phần của tập lệnh sao lưu. $ LNK là một liên kết đến đích rsync của ngày hôm trước.

Tôi không muốn / root / Branch1, / root / Branch2, / root / Branch3. hoặc nội dung của chúng được đồng bộ hóa. Nhưng chúng.

Dưới đây là các bit loại trừ tôi đã thử:

--exclude=branch*
--exclude='branch*'
--exclude '/branch*'
--exclude /branch*

Cảm ơn cho bất kỳ sự giúp đỡ / lời khuyên.

EDIT - để giải quyết cờ "có thể trùng lặp"

Câu hỏi này liên quan đến một danh sách các thư mục đã biết. Tôi cần loại trừ bất kỳ thư mục nào theo một mẫu, ngay cả khi những thư mục đó chưa tồn tại. tức là từ ví dụ của tôi, các thư mục khác có tên /branch*có thể được thêm vào. Tôi cần làm cho tập lệnh của mình trở thành bằng chứng trong tương lai và tránh chỉnh sửa tập lệnh khi một thư mục phù hợp với mẫu được thêm vào, vì các thư mục đó có thể là tạm thời.


tham số loại trừ của bạn là ok. Nếu rsync bỏ qua nhánh * khi sao chép, nó cũng bỏ qua nó khi xóa khỏi mệnh, do đó bạn phải xóa thủ công các thư mục này tại đích một lần.
Ipor Sircer

đích đến là một thư mục mới, trống, được tạo bởi tập lệnh bash của tôi. Tôi đã xóa các thư mục nhánh * từ thư mục link-Dest, nhưng không có kết quả.
Roger Creasy

1
Bạn phải sử dụng một mô hình đầy đủ rõ ràng như *branch*hoặc /root/branch*không phải là ngắn branch*- viết tắt không được tìm thấy và do đó không loại trừ.
Kondybas

@Kondybas Vì vậy, tất cả đều ổn trong các tùy chọn của tôi ngoại trừ tôi cần phải thêm một '*' cho chi nhánh loại trừ của mình? ( --exclude '*branch*)
Roger Creasy

Câu trả lời:


2

Bạn loại trừ quy tắc là chính xác. Tuy nhiên, rsync sẽ không xóa các tệp bị loại trừ trên đích mà không có tham số phụ --delete-excluded:

--delete-excluded also delete excluded files from dest dirs

Thí dụ:

#  tree test
test
|-- 123
|-- branch1
|-- branch2
|-- branch3
`-- other

#  tree test2
test2
|-- 123
|-- branch1
|-- branch2
|-- branch3
`-- other

# rsync -avh test/ test2 --delete --exclude='branch1' --delete-excluded
sending incremental file list
deleting branch1/

sent 140 bytes  received 27 bytes  334.00 bytes/sec
total size is 0  speedup is 0.00

#  tree test2
test2
|-- 123
|-- branch2
|-- branch3
`-- other

3 directories, 1 file

Tôi đã thay đổi các tùy chọn của mình trong tập lệnh thành bản -avh --exclude 'branch*' --stats --delete --delete-excluded --link-dest=$LNKsao lưu tối qua vẫn sao lưu các thư mục / nhánh *.
Roger Creasy

1

rsync phiên bản 3.1.3 (có thể sớm hơn, chưa được kiểm tra) loại trừ chính xác các thư mục con sử dụng cú pháp này (rõ ràng thay thế exclude_dirnamebằng mẫu bạn muốn loại trừ):

rsync [other opts...] --exclude='*/exclude_dirname/' /src/ /dst/

Điều này cũng hoạt động với các ký tự đại diện. Câu hỏi gốc sử dụng 'branch*', vì vậy điều này hoạt động:

rsync [other opts...] --exclude='*/branch*/' /src/ /dst/

Hi vọng điêu nay co ich.

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.