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à rsync
quy 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='*/'
và --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 .py
cá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 .py
tệp mà thư mục gốc sẽ được tìm thấy. .py
các tệp trong thư mục con sẽ không bao giờ được tìm thấy vì rsync
khô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á.
--include='*/'
?