Rsync, chỉ bao gồm một số loại tệp nhất định, ngoại trừ một số thư mục


14

Tôi muốn rsync chỉ một số loại tệp nhất định (ví dụ .py) và tôi muốn loại trừ các tệp trong một số thư mục (ví dụ venv).

Đây là những gì tôi đã thử:

rsync -avz --include='*/' --exclude='venv/' --include='*.py' --exclude='*' /tmp/src/ /tmp/dest/

Nhưng nó không hoạt động.

Tôi đang thiếu gì?

Tôi cũng đã làm theo câu trả lời cho câu hỏi này nhưng nó không có ích.


Tại sao bạn cần ban đầu --include='*/'?
Charlie Parker

1
Làm thế nào để tạo một lệnh nếu tôi có các thư mục đệ quy mà tôi muốn chỉ gửi một loại tệp. Có vẻ như nó chỉ làm điều đó cho thư mục đích có lẽ vì loại trừ cuối cùng loại trừ mọi thứ
Charlie Parker

Câu trả lời:


17

venv/cần được loại trừ trước khi */ được bao gồm:

rsync -avz --exclude='venv/' --include='*/' --include='*.py' --exclude='*' /tmp/src/ /tmp/dest/

Sự tinh tế là rsyncquy trình xử lý theo thứ tự và quy tắc khớp đầu tiên sẽ thắng. Vì vậy, nếu --include='*/'là trước --exclude='venv/', thì thư mục venv/được bao gồm bởi --include='*/'và quy tắc loại trừ không bao giờ được tham khảo.

Chúng ta có thể đơn giản hóa điều này?

Tại sao chúng ta cần --include='*/'--exclude='*'? Tại sao không --exclude=venv/ --include='*.py'đủ?

Mặc định là bao gồm các tập tin / thư mục. Vì vậy, hãy xem xét:

rsync -avz --exclude='venv/' --include='*.py' source target

Điều này sẽ bao gồm tất cả mọi thứ trừ các tập tin hoặc thư mục dưới venv/. Bạn, tuy nhiên, chỉ muốn .pycác tập tin. Điều đó có nghĩa là chúng tôi phải loại trừ rõ ràng các tệp khác với --exclude='*'.

--exclude='*'không bao gồm cả tập tin và thư mục Vì vậy, nếu chúng tôi chỉ định --exclude='*', thì tất cả các thư mục sẽ bị loại trừ và chỉ các .pytệp mà thư mục gốc sẽ được tìm thấy. .pycác tệp trong thư mục con sẽ không bao giờ được tìm thấy vì rsynckhông xem xét các thư mục bị loại trừ. Vì vậy, nếu chúng ta có --exclude='*', chúng ta cần đi trước nó --include='*/'để đảm bảo rằng nội dung của tất cả các thư mục được khám phá.


Tuyệt quá! Cảm ơn! Chỉ cần cho tôi hiểu, tại sao chúng ta cần --include='*/'--exclude='*'? Tại sao chỉ --exclude=venv/ --include='*.py'không làm việc?
CentAu

1
@CentAu Tôi vừa cập nhật câu trả lời với một cuộc thảo luận về điều đó.
John1024

Làm thế nào để tạo một lệnh nếu tôi có các thư mục đệ quy mà tôi muốn chỉ gửi một loại tệp. Có vẻ như nó chỉ làm điều đó cho thư mục đích có lẽ vì loại trừ cuối cùng loại trừ mọi thứ.
Charlie Parker

1
Đánh dấu trang! Đặc biệt là cho sự tinh tế. Tôi không thể nghĩ ra bất kỳ tiện ích CLI nào khác trong đó thứ tự của các cờ quan trọng cả!
antortjim
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.