Làm thế nào để loại trừ nhiều thư mục với rsync?


184

Tôi đang cố gắng sao lưu thư mục chính của mình bằng rsync và tôi muốn loại trừ một số thư mục chứa rác. Tôi muốn đặc biệt loại trừ /home/ben/.ccache/home/ben/build. Thật không may, tài liệu cho rsync là quá tải thông tin và không trả lời câu hỏi của tôi. Đây là những gì tôi đã cố gắng:

rsync -arv --exclude "/home/ben/.ccache:/home/ben/build" /home/ben /media/ben/thumbdrive/

Cách đúng đắn để làm điều này là gì?


4
Chỉ muốn nói rằng cờ đã angụ ý rrồi :)-a, --archive archive mode; equals -rlptgoD (no -H,-A,-X)
Populus

Câu trả lời:


238

OK tôi cảm thấy thật ngớ ngẩn. Trước khi tôi đăng câu hỏi này, bạn tôi đã chỉ cho tôi cách thực hiện và nó thực sự đơn giản. Để loại trừ nhiều thư mục bạn chỉ cần sử dụng nhiều --exclude=paththiết bị chuyển mạch. Vì vậy, lệnh của tôi ở trên được viết đúng như sau:

rsync -arv --exclude=.ccache --exclude=build /home/ben /media/ben/thumbdrive/

7
Một đường dẫn tuyệt đối không hoạt động đối với tôi (thư mục được chỉ định âm thầm không bị loại trừ), trong khi đó một đường dẫn liên quan đến thư mục nguồn hoạt động chính xác. Có thể tôi đang thiếu một cái gì đó, nhưng tôi sẽ thận trọng về khẳng định của @FreeSoftwareServers rằng các đường dẫn tuyệt đối luôn hoạt động.
Soren Bjornstad

5
FYI: Tùy chọn -abao gồm -rnhư vậy -arlà dư thừa.
David

4
Trái với những gì FreeSoftwareServers tin tưởng, đường dẫn loại trừ có liên quan đến đường dẫn nguồn, KHÔNG /. Vì vậy, nhận xét đó là sai về mặt phân loại và sẽ dẫn đến thất bại nếu bạn làm theo nó. Chiến lược tốt nhất là loại bỏ hàng đầu / trong loại trừ của bạn để tránh loại lỗi tinh thần này. Nếu nguồn là, / home / me và nếu bạn loại trừ = '/ mydir /' thì điều này sẽ loại trừ thư mục mydir trong / home / me, nghĩa là nó loại trừ / home / me / mydir KHÔNG / mydir / at /. Thật không may, tôi không thể downvote hoặc chỉnh sửa nhận xét đó vì nó sai về mặt kỹ thuật và sẽ gây hiểu lầm.
Lizardx

3
FYI cho khách du lịch sau này, có vẻ như nhận xét trong câu hỏi của @FreeSoftwareServer đã bị xóa. tl; dr: sử dụng các đường dẫn tương đối
Freedom_Ben

2
Nếu bạn câm thì tôi và 179 người khác cũng vậy!
Sridhar Sarnobat

108

Khi có nhiều thư mục và / hoặc tệp để loại trừ, hãy tạo một tệp văn bản và sử dụng --exclude-fromchuyển đổi. Tạo một tệp được gọi exclude_me.txtvà trong đó liệt kê các loại trừ của bạn. Ví dụ ( /home/ben/exclude_me.txt):

.ccache
build
.java
.gvfs
.xsession-errors

Sau đó, rsync của bạn sẽ trông giống như thế này:

rsync -arv --exclude-from='/home/ben/exclude_me.txt' /home/ben /media/ben/thumbdrive/

Đây là một số thông tin về các quy tắc bộ lọc có thể giúp:

  • /dir/ có nghĩa là loại trừ thư mục gốc /dir
  • /dir/*có nghĩa là lấy thư mục gốc /dirnhưng không phải nội dung
  • dir/ có nghĩa là loại trừ bất kỳ thư mục bất cứ nơi nào có tên dir/

  • Ví dụ loại trừ: /dir/, /usr/share/directory/, /var/spool/dir/ /var/spool/lpd/cfcó nghĩa là bỏ qua các tệp bắt đầu bằng cfbất kỳ thư mục nào trong/var/spool/lpd

Cũng xem phần quy tắc lọc trên trang man.


4
Điều quan trọng cần lưu ý là thư mục gốc có nghĩa là thư mục gốc không phải là thư mục gốc.
jamesdlin

Đây là một câu trả lời tuyệt vời!
Alexander Zhukov

85

Bạn cũng có thể loại trừ nhiều đường dẫn trong dấu ngoặc nhọn:

rsync -arv --exclude={.ccache,build} /home/ben /media/ben/thumbdrive/

40
Điều này hoạt động độc đáo, chỉ dưới sh, chỉ dưới bash, tôi đã tìm ra "cách khó khăn"
xor

7
Không có dấu cách sau dấu phẩy. Đã học được rằng cách quá khó
styl3r

Và đừng sử dụng '' like --exclude = '. Gvfs'
Martin T.

FWIW, tôi nghĩ rằng niềng răng xoăn làm việc với ksh. Đối với các shell khác, có lẽ bạn có thể sử dụng cái gì đó như : IFS=$'\n'; rsync -arv $(printf '.ccache\nbuild\n' | sed 's/^/--exclude=/g') /home/ben /media/ben/thumbdrive/. Hoặc, bạn chỉ có thể sử dụng nhiều --excludeđối số mà bạn phải nhập thủ công.
TSJNachos117

1
Lý do công việc này là vì "Mở rộng Brace", trong trường hợp bất cứ ai muốn xem chi tiết.
shredalert
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.