2011-11-25 47 views
19

Tôi đang cố sao chép dự án vào máy chủ của mình bằng rsync. Tôi có dự án cụ thể cài đặt các script trong thư mục conrsync loại trừ một thư mục nhưng bao gồm một thư mục con

dự án/kỹ thuật/cài đặt/project1

Những gì tôi đang cố gắng làm là loại bỏ tất cả mọi thứ trong dự án /specs thư mục nhưng dự án cụ thể cài đặt thư mục : dự án/thông số kỹ thuật/cài đặt/project1.

rsync -avz --delete --include=specs/install/project1 \ 
    --exclude=specs/* /srv/http/projects/project/ \ 
    [email protected]:~/projects/project 

Nhưng như thế này nội dung của thư mục thông số bị loại trừ nhưng thư mục install/project1 không được bao gồm.

Tôi đã thử mọi thứ nhưng tôi dường như không làm việc này

+1

Chỉ tìm thấy một câu hỏi tương tự trên linuxquestions.org có thể giúp: http://www.linuxquestions.org/questions/linux-software-2/rsync-include-exclude-problems-636504/ – Chris

+0

Cảm ơn bạn đã giải quyết xong nó! Rsync thực sự có một logic lạ đôi khi. – user1036651

+0

Các bản sao http://stackoverflow.com/questions/7960669/with-rsync-how-do-includes-and-excludes-combine/7961687#7961687 –

Trả lời

29

Thỉnh thoảng nó chỉ là một chi tiết.

Chỉ cần thay đổi bao gồm bạn mẫu thêm một dấu/ở cuối bao gồm mẫu và nó sẽ làm việc:

rsync -avz --delete --include=specs/install/project1/ \ 
    --exclude=specs/* /srv/http/projects/project/ \ 
    [email protected]:~/projects/project 

Hoặc, trong thay thế, hãy chuẩn bị một tập tin lọc như thế này:

$ cat <<EOF>pattern.txt 
> + specs/install/project1/ 
> - specs/* 
> EOF 

Sau đó, sử dụng tùy chọn --filter:

rsync -avz --delete --filter=". pattern.txt" \ 
    /srv/http/projects/project/ \ 
    [email protected]:~/projects/project 

Để biết thêm thông tin, hãy tham khảo phần QUY TẮC LỌC trong rsync (1) trang thủ công.

+2

Quy tắc lọc thực sự là cách duy nhất để giải quyết mọi thứ phức tạp hơn "loại trừ tất cả thư mục .git". –

8

Giải pháp khác không hoạt động ở đây.


cách đáng tin cậy

Bạn không có lựa chọn nào khác để tự xuống cho mỗi cấp độ của tiểu thư mục của bạn. Không có nguy cơ bao gồm các tệp không mong muốn, vì rsync không bao gồm các tệp của các thư mục được bao gồm.

1) Tạo một tập tin bao gồm bộ lọc, ví dụ "include_filter.txt":

+ /specs/ 
+ /specs/install/ 
+ /specs/install/project1/*** 
- /specs/** 

2) Chạy nó:

rsync -avz --delete --include-from=include_filter.txt \ 
    /srv/http/projects/project/ \ 
    [email protected]:~/projects/project 
  • Đừng quên dấu gạch chéo bắt đầu "/ ", nếu không bạn có thể so khớp các thư mục con có tên" **/specs/install/project1/".
  • Bằng cách chọn bộ lọc loại bao gồm (--include-from = FILE), dấu cộng "+" bắt đầu thực sự là tùy chọn, vì đây là hành động mặc định không có dấu. (Bạn có thể có đối số "-" theo mặc định với --exclude-from = FILE.)
  • Các ngôi sao kép "**" có nghĩa là "bất kỳ đường dẫn"
  • Các ngôi sao ba "***" có nghĩa là "bất kỳ con đường, trong đó có thư mục này rất"

Cách dễ dàng

Bạn có thể khởi động bộ lọc "* /", cho phép rsync hạ cấp tất cả các cấp phụ của bạn. Điều này thuận tiện nhưng:

  • Tất cả các thư mục sẽ được bao gồm, mặc dù trống. Điều này có thể được sửa với tùy chọn rysnc -m, nhưng sau đó tất cả các thư mục rỗng sẽ bị bỏ qua.

1) Tạo một file bao gồm bộ lọc, ví dụ "include_filter.txt":

+ /**/ 
+ /specs/install/project1/*** 
- /specs/** 

2) Chạy nó:

rsync -avzm --delete --include-from=include_filter.txt \ 
    /srv/http/projects/project/ \ 
    [email protected]:~/projects/project 

Lưu ý thêm tùy chọn -m.

Các vấn đề liên quan