2012-03-31 39 views
32

Tôi đang gặp khó khăn trong việc đúng cú pháp rsync của tôi và tôi tự hỏi nếu kịch bản của tôi thực sự có thể được xử lý với rsync. Trước tiên, tôi đã xác nhận rằng rsync đang hoạt động tốt giữa máy chủ cục bộ và máy chủ từ xa của tôi. Thực hiện đồng bộ hóa thẳng trên một thư mục thành công.Sử dụng Rsync bao gồm và không bao gồm tùy chọn để bao gồm thư mục và tập tin bằng mẫu

Đây là những gì hệ thống tập tin của tôi trông giống như:

uploads/ 
    1260000000/ 
    file_11_00.jpg 
    file_11_01.jpg 
    file_12_00.jpg 
    1270000000/ 
    file_11_00.jpg 
    file_11_01.jpg 
    file_12_00.jpg 
    1280000000/ 
    file_11_00.jpg 
    file_11_01.jpg 
    file_12_00.jpg 

Những gì tôi muốn làm chạy rsync là chỉ trên các tập tin mà bắt đầu bằng "file_11_" trong các thư mục con và tôi muốn để có thể chạy chỉ là một công việc rsync để đồng bộ hóa tất cả các tệp này trong các thư mục con.

Dưới đây là các lệnh mà tôi đang cố gắng:

rsync -nrv --include="**/file_11*.jpg" --exclude="*" /Storage/uploads/ /website/uploads/

kết quả này trong 0 Bức ảnh được đánh dấu để chuyển giao trong chạy khô của tôi. Tôi đã thử các kết hợp khác nhau của các câu lệnh --include và --exclude, nhưng vẫn tiếp tục không nhận được kết quả hoặc nhận mọi thứ như thể không có các tùy chọn bao gồm hoặc loại trừ nào được thiết lập.

Bất cứ ai có bất kỳ ý tưởng làm thế nào để làm điều này?

Trả lời

67

Vấn đề là --exclude="*" nói để loại trừ (ví dụ) thư mục 1260000000/, vì vậy rsync không bao giờ kiểm tra các nội dung của thư mục đó, vì vậy không bao giờ để ý rằng thư mục chứa các tập tin mà có thể đã được kết hợp bởi --include của bạn.

Tôi nghĩ rằng điều gần gũi nhất với những gì bạn muốn là thế này:

rsync -nrv --include="*/" --include="file_11*.jpg" --exclude="*" /Storage/uploads/ /website/uploads/

(mà sẽ bao gồm tất cả các thư mục, và tất cả các file phù hợp với file_11*.jpg, nhưng không có các file khác), hoặc lẽ này:

rsync -nrv --include="/[0-9][0-9][0-9]0000000/" --include="file_11*.jpg" --exclude="*" /Storage/uploads/ /website/uploads/

(cùng khái niệm, nhưng pickier nhiều về các thư mục nó sẽ bao gồm).

+1

Cảm ơn! Đó là chính xác những gì tôi cần. Kịch bản của tôi thực sự nhiều hơn hoặc ít hơn những gì bạn đã mô tả trong ví dụ thứ hai của mình, nhưng tôi đã giữ câu hỏi của mình đơn giản hóa để làm cho câu hỏi trở nên thẳng thắn hơn. –

+0

@SheldonChang: Bạn được chào đón! – ruakh

+5

Lưu ý tầm quan trọng của (ví dụ) '--include =" */"' trong bao gồm các thư mục ** mẹ ** của các tệp bạn thực sự muốn bao gồm. – mabraham

7

Thêm -m để trả lời khuyến cáo trên để prune thư mục rỗng.

2

rsync bao gồm loại trừ ví dụ mẫu:

"*"   means everything 
"dir1"  transfers empty directory [dir1] 
"dir*"  transfers empty directories like: "dir1", "dir2", "dir3", etc... 
"file*"  transfers files whose names start with [file] 
"dir**"  transfers every path that starts with [dir] like "dir1/file.txt", "dir2/bar/ffaa.html", etc... 
"dir***" same as above 
"dir1/*" does nothing 
"dir1/**" does nothing 
"dir1/***" transfers [dir1] directory and all its contents like "dir1/file.txt", "dir1/fooo.sh", "dir1/fold/baar.py", etc... 

Và thức lưu ý là chỉ đơn giản là không dựa vào dấu sao được sử dụng trong đầu để đánh giá con đường; như "**dir" (ok của nó để sử dụng chúng cho các thư mục hay tập tin mà không đường) và lưu ý rằng hơn hai dấu sao không làm việc cho tên tập tin.

+0

Câu trả lời của bạn là câu trả lời duy nhất có thể sử dụng được vì bạn giải thích hành vi chung. Các câu trả lời khác là quá cụ thể theo OP nhưng mỗi tình huống cần một giải pháp khác! Nó đã giúp tôi rất nhiều! –

+0

@AlBundy Im vui mừng! – TechJS

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