Cách loại trừ thư mục khỏi rsync


60

Tôi đang cố gắng sao lưu thư mục nhà của mình trên ổ NAS. Tôi đang đưa ra điều này:

rsync -Paz --exclude-from 'rsync-exclude.txt' /home/chris/ admin@192.168.1.65:LinuxHome

nơi rsync-exclude.txtcó nội dung này:

/home/chris/Downloads/*
/home/chris/Downloads/
/home/chris/Downloads/*.*

và nó nằm trong cùng thư mục tôi thực thi rsync (thư mục nhà).

Tuy nhiên, rsync cũng cố gắng sao chép thư mục này.

Tôi đang làm gì sai?

Câu trả lời:


88

Bạn đang cung cấp đường dẫn tuyệt đối trong danh sách loại trừ của bạn.

Với rsync, tất cả các đường dẫn loại trừ (hoặc bao gồm!) Bắt đầu bằng /được neo vào " gốc của chuyển khoản ".

Nguồn gốc của chuyển trong trường hợp này là /home/chris. Nếu bạn đã làm:

rsync -Paz --exclude-from 'rsync-exclude.txt' / admin@192.168.1.65:

... thì các loại trừ của bạn sẽ hoạt động (nhưng bạn sẽ sao chép mọi thứ khác trên hệ thống tệp đó!).

Nhưng kể từ khi bạn chỉ cố gắng để đồng bộ hóa của bạn nhà thư mục, và không có thư mục con của /home/christên "home/chris/Downloads", rsyncthấy không có gì phù hợp.

Vì vậy, hãy thử loại bỏ các /home/chrisphần từ rsync-exclude.txttập tin của bạn .

Trên thực tế, bạn chỉ cần một dòng duy nhất trong tệp:

/Downloads

Lưu ý rằng nếu bạn không chỉ định hàng đầu /và bạn tình cờ có các thư mục khác được đặt tên "Downloads", những thư mục đó cũng sẽ bị loại trừ. Tôi giả sử bạn chỉ muốn loại trừ thư mục "cấp cao nhất" (liên quan đến thư mục nguồn, còn gọi là thư mục "gốc của chuyển khoản") Downloads, vì vậy bạn sẽ muốn dẫn đầu /.

CÁCH DỄ DÀNG NHẤT (chỉ loại trừ một vài đường dẫn)

Nếu bạn chỉ cần loại trừ một thư mục, chỉ cần làm điều này (tránh một tệp riêng):

rsync -Paz --exclude /Downloads /home/chris/ admin@192.168.1.65:LinuxHome

Bạn cũng có thể xâu chuỗi --excludecác thẻ lại với nhau , như vậy:

rsync -Paz --exclude /Downloads --exclude '/Something Else' --exclude .hiddenFile /home/chris/ admin@192.168.1.65:LinuxHome

Lưu ý rằng vì không có dấu gạch chéo, rằng ai sẽ loại trừ .hiddenFiletừ bất kỳ mỗi thư mục nó sao chép!

Nhưng nếu bạn có nhiều hơn một vài loại trừ, bạn nên sử dụng --exclude-fromvà một tệp.

Ghi chú

Tôi thấy rằng bạn đã làm đúng, nhưng những người mới đến rsync nên lưu ý các dấu gạch chéo ở phần cuối của/home/chris/

Để trích dẫn rsynctrang man, "Bạn có thể nghĩ về một dấu / trên một nguồn có nghĩa là 'sao chép nội dung của thư mục này' trái ngược với 'sao chép thư mục theo tên'."

Vì vậy, nếu bạn rời khỏi dấu gạch chéo đó, cuối cùng bạn sẽ có một thư mục được gọi christrong thư mục đích, chứa tất cả mọi thứ từ /home/chris(ngoại trừ Downloadsthư mục gốc , tất nhiên!).


2

Điều này có thể dễ dàng hơn trong mắt và chỉ là một lưu ý về việc loại trừ các thư mục và cú pháp:

SRC='/home/username'
DST='/run/media/username/EasyStoreRT/rsync'

rsync -avrh --stats                                 \
    --log-file=/home/username/log/rsync-home.log    \
    --exclude='/username/.cache'                    \
    --exclude='/username/.local/share/Trash'        \
    $SRC \
    $DST \

Nó sẽ loại trừ các thư mục và tất cả các tập tin trong đó. Vì lý do nào, rysnc không được thêm / home / tên người dùng vào /.cache. Chỉ nhà / sẽ neo chính nó, vì vậy tôi phải thêm / tên người dùng vào mỗi thư mục bị loại trừ.

Các trang man nói, "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 nó được khớp với phần cuối của tên đường dẫn." Nhưng, hệ thống phân cấp đó dường như chỉ là thư mục đầu tiên trong thư mục nguồn. Tôi đang sử dụng bash, phiên bản 4.4.23 (1).

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.