TL, DR:
rsync -am --include='*.pdf' --include='*/' --exclude='*' ~/LaTeX/ ~/Output/
Rsync sao chép (các) nguồn đến đích. Nếu bạn chuyển *.pdf
dưới dạng nguồn, shell sẽ mở rộng danh sách này sang danh sách các tệp có .pdf
phần mở rộng trong thư mục hiện tại. Không có giao dịch đệ quy xảy ra vì bạn không vượt qua bất kỳ thư mục nào dưới dạng nguồn.
Vì vậy, bạn cần phải chạy rsync -a ~/LaTeX/ ~/Output/
, nhưng với một bộ lọc để nói với rsync chỉ sao chép .pdf
các tệp. Các quy tắc bộ lọc của Rupync có vẻ khó xử khi bạn đọc hướng dẫn, nhưng bạn có thể xây dựng nhiều ví dụ chỉ bằng một vài quy tắc đơn giản.
Bao gồm và loại trừ:
- Loại trừ các tệp theo tên hoặc theo vị trí rất dễ dàng :
--exclude=*~
, --exclude=/some/relative/location
(liên quan đến đối số nguồn, ví dụ: loại trừ này ~/LaTeX/some/relative/location
).
- Nếu bạn chỉ muốn khớp một vài tệp hoặc vị trí, hãy bao gồm chúng, bao gồm mọi thư mục dẫn đến chúng (ví dụ với
--include=*/
), sau đó loại trừ phần còn lại với --exclude='*'
. Điều này là do:
- Nếu bạn loại trừ một thư mục, điều này sẽ loại trừ mọi thứ bên dưới nó. Các tập tin loại trừ sẽ không được xem xét ở tất cả.
- Nếu bạn bao gồm một thư mục, điều này không tự động bao gồm nội dung của nó. Trong các phiên bản gần đây,
--include='directory/***'
sẽ làm điều đó.
- Đối với mỗi tệp, quy tắc khớp đầu tiên được áp dụng (và mọi thứ không bao giờ khớp được bao gồm).
Mẫu, mô hình, kiểu; khuôn mẫu:
- Nếu một mẫu không chứa a
/
, nó sẽ áp dụng cho thư mục sans tên tệp.
- Nếu một mô hình kết thúc bằng
/
, nó chỉ áp dụng cho các thư mục.
- Nếu một mẫu bắt đầu bằng
/
, nó áp dụng cho toàn bộ đường dẫn từ thư mục được truyền dưới dạng đối số rsync
.
*
bất kỳ chuỗi con nào của một thành phần thư mục (nghĩa là không bao giờ khớp /
); **
phù hợp với bất kỳ chuỗi con đường dẫn.
Nếu một đối số nguồn kết thúc bằng a /
, nội dung của nó sẽ được sao chép ( rsync -r a/ b
tạo b/foo
cho mọi a/foo
). Nếu không, chính thư mục được sao chép ( rsync -r a b
tạo b/a
).
Vì vậy, ở đây chúng ta cần bao gồm *.pdf
, bao gồm các thư mục chứa chúng và loại trừ mọi thứ khác.
rsync -a --include='*.pdf' --include='*/' --exclude='*' ~/LaTeX/ ~/Output/
Lưu ý rằng điều này sao chép tất cả các thư mục, ngay cả những thư mục không chứa tệp hoặc thư mục con phù hợp chứa một thư mục. Điều này có thể tránh được với --prune-empty-dirs
tùy chọn (nó không phải là một giải pháp phổ quát vì sau đó bạn không thể sao chép một thư mục ngay cả bằng cách khớp nó một cách rõ ràng, nhưng đó là một yêu cầu hiếm gặp).
rsync -am --include='*.pdf' --include='*/' --exclude='*' ~/LaTeX/ ~/Output/
**
mẫu của zsh ) nên hoạt động, mặc dù.