cp -r -l trong MacOS (bản sao đệ quy bảo tồn các liên kết cứng)


12

Tôi đang cố gắng sao chép một cây thư mục bảo toàn đệ quy các liên kết cứng vào tệp. Sử dụng gnu cp, điều này sẽ hoạt động với cờ -l. cp sau đó sẽ tạo lại cấu trúc thư mục, nhưng sẽ không cần phải sao chép nội dung của mỗi tệp.

Đây là sơ bộ cho một bản sao lưu, đầu tiên tôi muốn tạo một bản sao giá rẻ (liên kết cứng) của bản sao lưu trước đó và sau đó rsync thư mục nguồn trên bản sao này. Roughly:

 cp -r -l yesterdays_backup todays_backup
 rsync -a source_dir todays_backup

Thật không may, cp của OSX không hỗ trợ cờ -l, theo như tôi có thể nói, cpio không hỗ trợ sao chép đệ quy. Sự thay thế khác là pax, nhưng điều đó dẫn đến toàn bộ cấu trúc thư mục bị sao chép:

 pax -rw backups/yesterdays_backup backups/todays_backup

biến đổi:

 yesterdays_backup
 |
  \source_dir (...)

đến:

 todays_backup
 |
  \backups
          \yesterdays_backup
                            \source_dir(...)

Cần có một cách dễ dàng / rõ ràng để làm điều này, nhưng tôi hiện đang bị vấp ngã ... Có sự thay thế nào cho cpio và pax không? Tôi muốn tránh phải cài đặt gnu cp.

Tôi biết về Timemachine, nhưng điều đó sẽ không sao lưu đúng cách các thư mục được mã hóa tăng dần.

mac  backup  rsync  cp 

sử dụng find cùng với cpio, xung quanh việc thiếu cpio đệ quy như được mô tả ở đây: ( mikerubel.org/computers/rsync_snapshots/#Incremental ) nhưng không có vẻ rất thanh lịch ...

Câu trả lời:


16

Thật dễ dàng để cài đặt cp từ MacPorts, tuy nhiên, nếu bạn không muốn hoặc muốn tạo một tập lệnh di động, thì bạn có ba tùy chọn:

rsync

rsync --archive --link-dest=../yesterdays_backup backups/yesterdays_backup\
   backups/todays_backup

cpio

mkdir backups/todays_backup
cd backups/yesterdays_backup
find . -print | cpio -p -al ../todays_backup

pax

mkdir backups/todays_backup
cd backups/yesterdays_backup
pax -rwl . ../todays_backup

Điều gì nếu nguồn và đích nằm trong các đĩa khác nhau? Rsync vẫn bảo tồn các liên kết cứng từ nguồn trong bản sao được tạo ở đích?
lpacheco

7

Thật dễ dàng để cài đặt coreutilsgói từ MacPorts chứa cplệnh GNU được đổi tên thành gcp.

Nhưng thậm chí tốt hơn, các phiên bản mới hơn của rsync, bao gồm ít nhất là phiên bản OS X 10.5, hỗ trợ tùy chọn --link-Dest sẽ loại bỏ sự cần thiết của cp -al ban đầu. Xem ở đây . Bạn cũng nên sử dụng tùy chọn -E để sao chép các thuộc tính mở rộng, ACL, v.v.


1

Mặc dù cpiokhông hỗ trợ sao chép đệ quy trực tiếp, bạn có thể ăn trong danh sách chính xác các tập tin bạn muốn sao chép vào đầu vào tiêu chuẩn của nó, và đạt được hiệu quả của một bản sao đệ quy sử dụng findđường ống vào cpio. Điều này tương tự trực tiếp với việc sử dụng GNU tarvới các tùy chọn -T -(có nghĩa là đọc danh sách các tệp để sao lưu từ đầu vào tiêu chuẩn).


1

Tôi tin rằng những gì bạn muốn cũng có thể đạt được với ditto yesterdays_backup todays_backup. Theo mặc định, dittomột bản sao đệ quy bảo tồn các liên kết cứng, ACL và các thuộc tính mở rộng.


vấn đề là bản sao không còn rẻ nữa khi mục tiêu là tạo các liên kết cứng trên phạm vi thư mục. ditto có thể bảo quản chúng khi chúng tồn tại, nhưng không thể yêu cầu liên kết thay vì tạo một bản sao.
Florenz Kley

Tôi không nghĩ rằng ditto thậm chí có thể được bảo lưu các liên kết cứng của thư mục. trang man nói rằng nó chỉ gửi các liên kết cứng
Chris F Carroll

0

+1 cho câu trả lời của Pauls. ditto sẽ là một tùy chọn, nhưng chỉ khi được sử dụng cùng với find - nó bảo toàn các liên kết cứng, nhưng chỉ trong các thư mục.

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.