rsync một danh sách các thư mục với đường dẫn tuyệt đối trong tệp văn bản


9

Tôi có một tệp văn bản chứa danh sách các thư mục với đường dẫn tuyệt đối của nó

$ cat DirectoriesToCopy.txt

/data/Dir1
/data/Dir2

Tôi muốn sử dụng rsync để sao chép tất cả các thư mục này bảo vệ đường dẫn tuyệt đối của nó đến một vị trí khác.

Tôi đã thử lệnh rsync sau, nhưng nó không hoạt động

rsync -avr --include-from=DirectoriesToCopy.txt --exclude='*/' --exclude='/*'  /  /media/MyDestination/

Điều gì đang xảy ra ở đây?


Bạn có muốn chuyển /data/Dir1/data/Dir2bao gồm nội dung của họ đến /media/MyDestination/Dir1/media/MyDestination/Dir2? Hay bạn muốn bao gồm /datamột phần? Danh sách này lớn đến mức nào, có quá lớn không khi chỉ liệt kê những mục đó trên dòng lệnh? Dù sao, --excludetuyên bố của bạn ngăn chặn sự đệ quy.
wurtel 17/12/14

Tôi cũng muốn chuyển tất cả các tập tin trong các thư mục đó. Có nhiều tệp trong thư mục đó, vì vậy tôi muốn tránh tạo một tệp văn bản khác với tất cả tên tệp.
Ấn Độjoe

Tôi muốn giữ con đường đầy đủ của tôi như thế nào /media/MyDestination/data/Dir2/. Tôi đã thêm --exclude để ngăn các thư mục và tệp khác trong / khỏi bị sao chép.
Ấn Độjoe

Trong trường hợp danh sách các thư mục không lớn lắm, tôi đoán tùy chọn sau dễ dàng hơnrsync -av $(cat DirectotiesToCopy.txt) /media/MyDestination/
Ấn Độjoe 18/12/14

Câu trả lời:


6

Sử dụng lệnh sau:

rsync -av --include-from=DirectoriesToCopy.txt --include /data/ --exclude='/data/*' --exclude='/*/' / /media/MyDestination/

Bạn cần bao gồm / data / một cách rõ ràng, bạn cũng có thể đã thêm nó vào danh sách trong tệp. Sau đó loại trừ tất cả các thư mục khác (thứ tự là quan trọng với bao gồm / loại trừ).

Lưu ý rằng việc sử dụng của bạn -rlà dư thừa vì nó được bao gồm trong -a.

EDIT: Bạn cũng có thể hoàn thành kết quả tương tự với:

rsync -av --relative /data/Dir1 /data/Dir2 /media/MyDestination/

Đó không phải là rsync buộc bạn phải làm những điều khó khăn chỉ để sao chép một vài thư mục, nó chỉ cung cấp cho bạn nhiều cách để làm điều tương tự; trong một số trường hợp, cách bao gồm / loại trừ có thể phù hợp hơn, ở đây tôi sẽ thực hiện điều - liên quan ở trên (mà không cần --relativekết thúc /media/MyDestination/Dir1/media/MyDestination/Dir2, với --relativetoàn bộ đường dẫn nguồn được sao chép đến đích).


Cảm ơn bạn đã làm việc. Tôi hơi ngạc nhiên khi người ta phải xác định trình tự các bộ lọc cẩn thận như vậy chỉ đơn giản là sao chép danh sách các thư mục bằng rsync. Ví dụ: nếu danh sách thư mục của tôi không nằm dưới một thư mục / dữ liệu chung mà thay vào đó được trải rộng ở nhiều vị trí, các bộ lọc để xác định sẽ trở nên khá phức tạp.
Ấn Độjoe

Xem chỉnh sửa của tôi để trả lời của tôi.
wurtel

Cảm ơn. Vì vậy, nếu danh sách các thư mục của tôi không quá lớn, tôi có thể sử dụng cờ - liên quan như dưới đây. rsync -av --relative $(cat DirectotiesToCopy.txt) /media/MyDestination/
Ấn Độjoe

Đúng; hãy nhớ --relativechỉ là một lựa chọn khác
wurtel

7

Tôi muốn sử dụng rsync để sao chép tất cả các thư mục này [từ danh sách] giữ đường dẫn tuyệt đối của nó đến một vị trí khác

Đừng sử dụng --includehoặc --filterbiến thể, vì điều đó sẽ chỉ gây nhầm lẫn mọi thứ. Thay vào đó, sử dụng --files-from=_filename_. (Nếu bạn làm như vậy, hãy chắc chắn rằng bạn thực hiện nhiều thử nghiệm.)

  1. Tạo danh sách thư mục trong một tệp, một thư mục / tệp trên mỗi dòng.

  2. Sử dụng rsync --files-from=với tệp trên.

  3. Sử dụng --relative/ -Rtùy chọn để đảm bảo tên đường dẫn nguồn được sao chép ở cuối đích.

  4. Ngay cả khi bạn có -atùy chọn, cũng bao gồm -r. Từ trang người đàn ông:

    Trong cả hai trường hợp, nếu tùy chọn -r được bật, toàn bộ hệ thống phân cấp của thư mục đó cũng sẽ được chuyển (lưu ý rằng -r cần được chỉ định rõ ràng với --files-from, vì nó không được ngụ ý bởi -a).

Hoàn thành lệnh:

rsync ${DEBUG:+-nv} -arR --files-from=<list_of_files.txt> <top-level-dir>  <target-dir>

(các tệp trong list_of_files.txt phải tương đối hoặc được tìm thấy trong thư mục cấp cao nhất )

(nếu DEBUG được đặt, rsync chỉ in ra những gì có thể đã được sao chép.)


1
Đây là những gì tôi cần! Tuy nhiên "--incolee-from" nên là "--files-from". Ngoài ra, tôi đã sử dụng "- chỉ dành cho danh sách" để xem bản xem trước về những gì RSYNC sẽ làm trước khi thực sự cho phép nó hoạt động.
Adambean

1
Cảm ơn, tôi đã cập nhật câu trả lời. --include-fromcũng sẽ làm việc, nhưng sau đó những gì tôi nói về -rphần lớn không liên quan.
Otheus

2

Các nhãn hiệu rsync cảnh báo về kịch bản này (phần “Bao gồm / loại trừ quy định mẫu”):

việc này sẽ không hiệu quả:

+ /some/path/this-file-will-not-be-found
+ /file-is-included
- *

Điều này không thành công vì thư mục mẹ "some"bị loại trừ bởi '*'quy tắc, vì vậy rsync không bao giờ truy cập bất kỳ tệp nào trong thư mục "some"hoặc "some/path"thư mục. Một giải pháp là yêu cầu bao gồm tất cả các thư mục trong hệ thống phân cấp bằng cách sử dụng một quy tắc duy nhất: "+ */"(đặt nó ở đâu đó trước "- *"quy tắc) và có thể sử dụng --prune-empty-dirstùy chọn. Một giải pháp khác là thêm các quy tắc bao gồm cụ thể cho tất cả các thư mục mẹ cần được truy cập. Chẳng hạn, bộ quy tắc này hoạt động tốt:

+ /some/
+ /some/path/
+ /some/path/this-file-is-found
+ /file-also-included
- *

Trong trường hợp của bạn, tôi nghĩ rằng cách tiếp cận đơn giản nhất sẽ được preprocess danh sách các thư mục bao gồm do đó bất cứ khi nào bạn bao gồm /path/to/foo, bạn cũng bao gồm tất cả các thư mục mẹ ( /path/to, /path, /), và cũng có thể bao gồm các thư mục con của thư mục gốc ( /path/to/foo/***), và sau tất cả điều này có một quy tắc loại trừ mọi thứ không được liệt kê trước đây ( *).

<DirectoriesToCopy.txt awk '
    {print "+ " $0 "/***"; while (sub(/\/+[^\/]+\/*$/, "/")) print "+ " $0}
    END {print "- *"}
' >rsync-rules.txt
rsync -avr --include-from=rsync-rules.txt  /  /media/MyDestination/

Cảm ơn đã giải thích chi tiết và tập lệnh để tạo tệp quy tắc. Tôi hiểu vấn đề bây giờ. Tôi vẫn cảm thấy thật tuyệt khi rsync có một tùy chọn như --dirs-from = DirectoriesToCopy.txt như một cách rút gọn cho tất cả các bộ lọc phức tạp.
Ấn Độjoe
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.