rsync loại trừ thư mục không hoạt động


34

Tôi đang chạy Fedora 17 64-bit và rsync --exclude=/home/ben/<dir>nó không hoạt động như mong đợi.

Tôi đang cố gắng để rsyncthư mục nhà của tôi vào một ổ đĩa ngón tay cái, nhưng tôi muốn loại trừ chắc chắn các thư mục chứa các tập tin bộ nhớ cache và xây dựng các tập tin. Đây là lệnh tôi đang sử dụng:

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

Tuy nhiên, nội dung từ ~/build~/.ccacheđang được sao chép bởi rsync. Tôi đang làm gì sai?


1
Tôi nghĩ rằng loại trừ các mẫu chỉ không hoạt động.
Sören

Câu trả lời:


37

rsyncQuy tắc lọc toàn cầu bắt đầu bằng một đầu /được neo vào gốc của chuyển. Trích dẫn từ phần "INCLUDE / EXCLUDE PATULN RULES" của trang man:

nếu mẫu bắt đầu bằng a / thì nó được neo vào một vị trí cụ thể trong hệ thống phân cấp của các tệp, nếu không thì nó được khớp với phần cuối của tên đường dẫn. Điều này tương tự như một ^ hàng đầu trong các biểu thức thông thường. Do đó, "/ foo" sẽ khớp với tên của "foo" ở "gốc của chuyển khoản" (đối với quy tắc chung) hoặc trong thư mục của tệp hợp nhất (đối với quy tắc mỗi thư mục).

Trong lệnh của bạn ( rsync ... -arv /home/ben home-ben/), tệp /home/ben/foosẽ được chuyển đến home-ben/ben/foo. Nguồn gốc của chuyển là home-benvà đường dẫn bộ lọc chính xác là /ben/foo. Như vậy

  • để phù hợp với /home/ben/.ccachebạn, bạn cần một đường dẫn bộ lọc/ben/.ccache
  • để phù hợp với /home/ben/build/bạn, bạn cần một đường dẫn bộ lọc/ben/build/

Một lời giải thích chi tiết hơn có thể được tìm thấy trong phần "ANCHORING INCLUDE / EXCLUDE THỰC HIỆN" của rsync(1)trang man .


Lưu ý rằng chỉ cần bỏ đi hàng đầu /không nhất thiết là những gì bạn muốn. Trích dẫn một lần nữa từ cùng một phần trang người đàn ông:

Một "foo" không đủ tiêu chuẩn sẽ khớp với tên của "foo" ở bất cứ đâu trong cây vì thuật toán được áp dụng đệ quy từ trên xuống; nó hoạt động như thể mỗi thành phần đường dẫn có một lượt ở cuối tên tệp. Ngay cả "phụ / foo" chưa được quản lý sẽ khớp với bất kỳ điểm nào trong hệ thống phân cấp nơi "foo" được tìm thấy trong một thư mục có tên "phụ". Xem phần về ANCHORING INCLUDE / EXCLUDE THỰC HIỆN để biết một cuộc thảo luận đầy đủ về cách chỉ định một mẫu phù hợp ở gốc của chuyển khoản.

Do đó, một mẫu bộ lọc build/sẽ khớp với một thư mục xây dựng ở bất cứ đâu trong /home/ben, thậm chí /home/ben/many/sub/directories/build/.


2
Các chi tiết quan trọng là dấu gạch chéo. Nếu bạn thêm một dấu gạch chéo vào cuối thư mục nguồn (rsync -a source / Destination), nó sẽ sao chép nội dung của nguồn, nếu không thì rsync -a source destinationsao chép chính thư mục nguồn vào đích. Điều này xác định gốc của chuyển sẽ là gì để thông báo biểu thức loại trừ. Việc sử dụng đúng / trong biểu thức loại trừ sau đó được giải thích ở trên. Đặc biệt lưu ý rằng rsync --exclude='/dir1' source destinationsẽ không loại trừ bất cứ điều gì.
pgoetz

11

Tôi nghĩ rằng các excludeđường dẫn của bạn cần phải liên quan đến đường dẫn nguồn. Bạn có thể thử điều này thay thế?

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

Đây là một thử nghiệm, để so sánh:

/tmp$ tree src dest
src
├── a
└── b
dest
└── foo/

/tmp$ rsync -nav --exclude /tmp/src/b /tmp/src /tmp/dest
sending incremental file list
src/
src/a
src/b

$ rsync -nav --exclude b /tmp/src /tmp/dest
sending incremental file list
src/
src/a

2
Câu trả lời này là sai. Với một đường dẫn loại trừ tương đối, bạn sẽ loại trừ mô hình ở khắp mọi nơi!
rubo77

Bài này đúng. Sự phù hợp là dựa trên văn bản, không dựa trên tập tin inode. Bất cứ đường dẫn nào, đầu ra của --verboselệnh hiển thị là định dạng bạn phải sử dụng.
Sridhar Sarnobat

Điều này làm việc cho tôi.
Zhenyu

Điều gì xảy ra nếu đường dẫn nguồn là '/' thì tuyệt đối là các đường dẫn tương đối, nhưng nó vẫn không hoạt động.
Sören

Đây là điều duy nhất làm việc cho tôi.
Jonathan

2

Tôi đã có vấn đề này trong một kịch bản (tôi không biết nếu đó là trường hợp của bạn). Tôi là bởi vì tôi đã sử dụng lệnh này trong một kịch bản và tôi đã sử dụng sh thay vì bash. kiểm tra shebang ở đầu tập lệnh của bạn.


1

Mẫu loại trừ của bạn sẽ hoạt động, nếu bạn đồng bộ hóa toàn bộ / đường dẫn nhà, tức là không có dấu gạch chéo:

rsync --exclude=/home/ben/build/ --exclude=/home/ben/.ccache -arv /home home-all/

Nhưng tốt hơn là chỉ rsync nội dung của thư mục bằng dấu gạch chéo:

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

Bạn cũng có thể sử dụng danh sách bỏ qua, xem: https : //askubfox.com/questions/545655/backup-your-home-directory-with-rsync-and-skip-usless- Folders


0

Để loại trừ một thư mục cụ thể với rsync, bạn cần xem xét đường dẫn tương đối trong lệnh. trong trường hợp của bạn:

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

trong đó "ben" là thư mục bạn đang đồng bộ hóa

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.