Làm thế nào để sao chép thư mục với bảo quản liên kết cứng?


40

Làm cách nào để di chuyển các thư mục có các tệp chung từ phân vùng này sang phân vùng khác?

Giả sử chúng ta có phân vùng được gắn kết /mnt/Xvới các thư mục chia sẻ tệp với các liên kết cứng. Làm thế nào để di chuyển các thư mục như vậy sang một phân vùng khác, hãy để nó được /mnt/Ybảo tồn các liên kết cứng đó.

Để minh họa rõ hơn ý của tôi là "các tệp chia sẻ thư mục chung với các liên kết cứng", đây là một ví dụ:

# let's create three of directories and files
mkdir -p a/{b,c,d}/{x,y,z}
touch a/{b,c,d}/{x,y,z}/f{1,2,3,4,5}
# and copy it with hardlinks
cp -r -l a hardlinks_of_a

Để cụ thể hơn, hãy giả sử rằng tổng kích thước của tệp là 10G và mỗi tệp có 10 liên kết cứng. Câu hỏi là làm thế nào để di chuyển nó đến đích bằng cách sử dụng 10G (ai đó có thể nói về việc sao chép nó với 100G và sau đó chạy trùng lặp - đó không phải là điều tôi đang hỏi về)

Câu trả lời:


29

Câu trả lời đầu tiên: Cách GNU

Các cp -abản sao GNU bảo toàn đệ quy càng nhiều cấu trúc và siêu dữ liệu càng tốt. Liên kết cứng giữa các tập tin trong thư mục nguồn được bao gồm trong đó. Để chọn bảo quản liên kết cứng cụ thể mà không cần tất cả các tính năng khác -a, sử dụng --preserve=links.

mkdir src
cd src
mkdir -p a/{b,c,d}/{x,y,z}
touch a/{b,c,d}/{x,y,z}/f{1,2,3,4,5}
cp -r -l a hardlinks_of_a
cd ..
cp -a src dst

3
+1 trên tar, -1 để sử dụng các đối số cụ thể của gnu cho cp.
WhyNotHugo

Bạn đã đưa ra ba câu trả lời trong một. Bạn có thể chia chúng thành ba để chúng có thể được nhận xét và đánh giá riêng? (Mẹo: Bạn có thể chỉnh sửa này, để lại chỉ một - ví dụ "cp -a" Sau đó thêm hai hơn, vì "tar" và "khách".)
Grzegorz Wierzowiecki

1
@GrzegorzWierzowiecki chia tay hoàn thành
Alan Curry

6
@Hugo: không có gì sai khi sử dụng các đối số cụ thể của GNU cho các công cụ tiêu chuẩn. Các phiên bản GNU là tiêu chuẩn không chính thức ngày nay và ngay cả khi chúng không được cài đặt sẵn, việc cài đặt các công cụ GNU (tôi biết tôi luôn làm như vậy - chúng đơn giản là tốt hơn so với các phiên bản solaris và * bsd và họ đã cung cấp tính nhất quán giữa các * nixes khác nhau). Có lẽ nên thực hành tốt để chỉ ra GNUism khi bạn sử dụng chúng nhưng không bắt buộc. Ngoài ra Grzegorz đã không nói "không phải trên linux" vì vậy thật hợp lý khi cho rằng đó là môi trường mà anh ấy đang nói đến.
cas

1
@WhyNotHugo: POSIX "có thể chuẩn hơn như thế nào?". POSIX là thứ mang chúng ta đến nơi chúng ta đang ở. Bạn có biết rằng tất cả các phiên bản Windows kể từ Windows NT đều tuân thủ POSIX hoàn toàn không? Chúng có giới hạn độ dài đường dẫn là 255 ký tự khi sử dụng các hàm I / O của tệp POSIX, khiến chúng trở nên vô dụng. Bạn có biết rằng Solaris, Irix, HP-UX đều tuân thủ POSIX và tất cả các đối số cho các công cụ của họ đều khác nhau (ví dụ: tar). cp -a là một yêu cầu tối thiểu cho bất kỳ phiên bản cp nào muốn thay thế bản sao GNU.
Julian Overmann

36

rsync có -Hhoặc --hard-linkstùy chọn cho việc này và có các lợi ích rsync thông thường là có thể dừng và khởi động lại, và được chạy lại để xử lý hiệu quả với bất kỳ tệp nào đã bị thay đổi trong / sau lần chạy trước.

-H, --hard-links
    This tells rsync to look for hard-linked files in
    the source and link together the corresponding
    files on the destination.  Without  this option,
    hard-linked files in the source are treated as
    though they were separate files. [...]

Đọc rsynctrang người đàn ông và tìm kiếm -H. Có rất nhiều chi tiết ở đó về sự cẩn thận cụ thể.


2
Tôi đã kiểm tra - nó hoạt động.
Grzegorz Wierzowiecki

Vâng tôi biết. Tôi đã sử dụng nó trong nhiều năm trong các kịch bản sao lưu của mình. cũng để di chuyển các tập tin giữa các hệ thống tập tin như trong câu hỏi của bạn.
cas

rsync sử dụng gobs bộ nhớ khi xây dựng danh sách tập tin của nó. Đối với tôi sau nhiều giờ "Xây dựng danh sách tập tin ...", nó đã lấp đầy 16GB bộ nhớ của tôi và bảo lãnh không sao chép gì cả. YMMV.
msc

2
Từ man rsync: Bắt đầu với rsync 3.0.0, thuật toán đệ quy được sử dụng bây giờ là quét tăng dần sử dụng ít bộ nhớ hơn trước và bắt đầu chuyển sau khi quét một vài thư mục đầu tiên đã hoàn tất. Quét tăng dần này chỉ ảnh hưởng đến thuật toán đệ quy của chúng tôi và không thay đổi chuyển không đệ quy. Cũng chỉ có thể khi cả hai đầu của quá trình chuyển ít nhất là phiên bản 3.0.0. Lưu ý rằng cả hai --delete-before--delete-aftervô hiệu hóa thuật toán cải tiến này.
cas

Ngoài ra, mặc dù rsynccũng cực kỳ hữu ích, nó không phải luôn là công cụ tốt nhất cho mọi công việc. Ngày nay, tôi thích sử dụng bộ dữ liệu ZFS để tôi có thể chụp nhanh và zfs sendchúng - tôi chủ yếu sử dụng rsync trên các hệ thống tệp không phải ZFS. btrfscó một ảnh chụp nhanh tương tự + khả năng gửi.
cas

14

Câu trả lời thứ ba: Cách POSIX

POSIX chưa chuẩn hóa tartiện ích, mặc dù họ đã chuẩn hóa tarđịnh dạng lưu trữ. Tiện ích POSIX để thao tác lưu trữ tar được gọi paxvà nó có tính năng thưởng là có thể thực hiện thao tác đóng gói và giải nén trong một quy trình duy nhất.

mkdir dst
pax -rw src dst

10

Câu trả lời thứ hai: Cách thức UNIX cổ đại

Tạo một kho lưu trữ tar trong thư mục nguồn, gửi nó qua một đường ống và giải nén nó trong thư mục đích.

# create src as before
(cd src;tar cf - .) | (mkdir dst;cd dst;tar xf -)

1
đã kiểm tra -> công trình. Liên kết cứng được bảo quản.
Grzegorz Wierzowiecki

1
Bất kỳ cái nhìn sâu sắc về lý do tại sao điều này thực sự bảo tồn các liên kết cứng?
peterph

1
Bởi vì tarbảo tồn các liên kết cứng. Trong GNU tar, ít nhất, bạn có thể vô hiệu hóa hành vi này với--hard-dereference
cas

Trong trường hợp của tôi, cố gắng sao chép một hệ thống phân cấp thư mục lớn (bản sao lưu TimeMachine), tar đã bảo tồn một số liên kết cứng nhưng sao chép tệp trong một số trường hợp. Tôi nghĩ điều này là do tar xkhông có danh sách tệp đầy đủ vì các tệp vẫn đang được lấy từ tar c. Có lẽ nếu bạn đã lưu toàn bộ kho lưu trữ trước khi giải nén nó, nó sẽ ổn thôi. Tôi sẽ rất vui nếu ai đó có thể xác nhận lý thuyết đó.
msc

10

Nguồn: http://www.cyberciti.biz/faq/linux-unix-apple-osx-bsd-rsync-copy-hard-links/

Những gì bạn cần để tạo một bản sao chính xác là

rsync -az -H --delete --numeric-ids /path/to/source/ /path/to/dest/

Xem nhận xét của tôi về rsync ở trên.
msc

1
Tôi nghi ngờ điều này sẽ không sao chép ACL, thuộc tính mở rộng, v.v. Phiên bản Linux cũng có các tùy chọn -A và -X để duy trì các tùy chọn này, nhưng tôi nghĩ bạn đã hết may mắn trên MacOS.
Edward Falk
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.