Làm cách nào tôi có thể sử dụng rsync để nhân đôi cây thư mục, tạo liên kết cứng vào tệp?


23

Thỉnh thoảng, tôi phải thực hiện một số thay đổi di chuyển lớn trên các tệp dữ liệu trên máy chủ của mình và tôi đang tìm kiếm một cách tốt để làm điều này. Tôi đã suy nghĩ về việc sử dụng rsync để sao chép cấu trúc thư mục của mình bắt đầu từ thư mục dữ liệu gốc, tạo các liên kết cứng đến tất cả các tệp gốc (một số trong số chúng khá lớn) và tôi có thể ghi đè lên cây đích chỉ các tệp cần di chuyển. Cuối cùng, tôi có thể chuyển từ các tệp cũ sang các tệp mới một cách an toàn với hai mvthao tác.

Tuy nhiên, tôi dường như không thể có được rsync để làm điều này. Tôi đã thử

rsync -a --link-dest=$DATA $DATA $DATA/../upgrade_tmp

nhưng thay vì tạo các liên kết cứng đến các tệp, rsync sao chép chúng hoàn toàn. Có vấn đề gì khi sử dụng cùng một thư mục nguồn và link-Dest không?

Câu trả lời:


21

rsync là một công cụ mạnh mẽ, nhưng thật không may, rất kỳ lạ về một số tên đường dẫn của nó.

Nếu $DATAlà một đường dẫn tuyệt đối (nghĩa là nó bắt đầu bằng a /), thì dòng lệnh chính xác sẽ sử dụng là:

rsync -a --link-dest=$DATA $DATA/ $DATA/../upgrade_tmp

[Bây giờ, chỉ là một chút ngắn gọn về rsyncsự kỳ lạ của. Lưu ý dấu vết /được thêm vào đối số nguồn. Điều này nói rsyncđể làm việc với các nội dung của thư mục nguồn, chứ không phải với chính thư mục nguồn. (Tôi cho rằng $DATAkhông có dấu vết /.) Trong trường hợp này, chúng tôi muốn làm việc với nội dung, vì vậy chúng tôi thêm dấu vết /.]

Mặt khác, nếu $DATAlà một đường dẫn tương đối (nghĩa là nó không bắt đầu bằng a /), thì nhận xét của Sean R --link-destlà đập vào: Đường dẫn liên kết được hiểu tương đối với đường dẫn đích , vì vậy bạn sẽ sử dụng như sau:

rsync -a --link-dest=../`basename $DATA` $DATA/ $DATA/../upgrade_tmp

CHỈNH SỬA

Một lưu ý cuối cùng, hóa ra dòng rsynclệnh thứ hai tôi đưa ra sẽ hoạt động bất kể đó $DATAlà đường dẫn tuyệt đối, vì basenamekhông quan tâm đường dẫn là tuyệt đối hay tương đối.


1
Chỉ cần một dấu gạch chéo bị thiếu, ai có thể nghĩ về điều đó Cảm ơn vì lời giải thích hay!
Jean-Philippe Pellet

Cảm ơn bạn vì điều này, tôi đã thử làm theo một số hướng dẫn sao lưu gia tăng, như cái này và không tìm thấy bất kỳ đề cập nào về vấn đề này. Đây là điều duy nhất thực sự đảm bảo các tệp được liên kết cứng. Kiểm tra số lượng ref là> 1 và số inode giống vớils -ilah
Walf

Tôi đã sử dụng kết hợp với hàm relpath () được mô tả tại unix.stackexchange.com/a/85068/57414 để sao lưu một $SOURCEthư mục vào một $TARGETthư mục như thế này:SOURCE='abs_path_to_backup'; TARGET='.'; rsync -a --link-dest=$(relpath $TARGET $SOURCE) $SOURCE/ $TARGET/
Nathan S. Watson-Haigh

13

Những gì bạn muốn là "cp -al":

cp -al $DATA/ $DATA/../upgrade_tmp/
  • -a đệ quy như rsync -a
  • -l sẽ cứng các tập tin liên kết thay vì sao chép chúng.

1
cp -alrất tiếc là không có sẵn trên hệ thống của tôi (Mac OS X 10.6). Thay vào đó, tôi sẽ sử dụng pax ...
Jean-Philippe Pellet

7

Các --link-desttùy chọn trong rsynclà tương đối so với điểm đến thư mục, không phải là thư mục hiện hành. Vì vậy, những gì bạn muốn là:

rsync -a --link-dest=../`basename $DATA` $DATA $DATA/../upgrade_tmp

Rất tiếc, ý tôi là tên cơ sở, ban đầu tôi có dirname.
Sean Reifschneider

1
Trang man nói rằng --link-desttùy chọn đó , nếu tương đối , có liên quan đến thư mục đích. Trong trường hợp của tôi, nó là tuyệt đối. Ngay cả làm cho nó liên quan đến thư mục đích cũng không làm cho nó hoạt động.
Jean-Philippe Pellet

7

Hóa ra khó thực hiện việc này rsynchơn so với các công cụ khác. Câu trả lời đúng cho rsynclà của Steven Monai, nhưng cách dễ nhất để làm điều này là sử dụng một trong hai cp -alhoặc pax -rwltrên các hệ thống -lkhông phải là một tùy chọn hợp lệ cho cp:

pax -rwl $DATA $DATA/../upgrade_tmp

hoặc là

cp -al $DATA/ $DATA/../upgrade_tmp/

4

Nó hoạt động với tôi:

$ rsync --hard-links --recursive --link-dest=/local user@host:/remote/ /local

Tôi sử dụng rsync phiên bản 3.1.0.

Từ người đàn ông :

- liên kết

Yêu cầu rsync tìm kiếm các tệp được liên kết cứng trong quá trình chuyển, không có tùy chọn này, các tệp được liên kết cứng trong quá trình chuyển được xử lý như thể chúng là các tệp riêng biệt.

--link-mệnh = TRỰC TIẾP

Các tệp không thay đổi được liên kết cứng từ DIR đến thư mục đích. Các tệp phải giống hệt nhau trong tất cả các thuộc tính được bảo tồn (ví dụ: quyền, có thể là quyền sở hữu) để các tệp được liên kết với nhau


2
Chỉ đoạn mã là không đủ, giải thích những gì nó làm và tại sao.
peterh nói phục hồi Monica

--hard-links Yêu cầu rsync tìm kiếm các tệp được liên kết cứng trong quá trình chuyển, không có tùy chọn này, các tệp được liên kết cứng trong quá trình chuyển được xử lý như thể chúng là các tệp riêng biệt. --link-Dest = DIR Các tệp không được trao đổi được liên kết cứng từ DIR đến thư mục đích. Các tệp phải giống hệt nhau trong tất cả các thuộc tính được bảo tồn (ví dụ: quyền, có thể là quyền sở hữu) để các tệp được liên kết với nhau.
Alexander Fedorov

1
Tuyệt vời. Cảm ơn bạn. Trên thực tế, tôi tìm thấy câu trả lời của bạn trong hàng đợi "chất lượng thấp". Điều đó có nghĩa là, đã có một cuộc bỏ phiếu nếu câu trả lời của bạn có nên bị xóa hay không. Nhưng không chỉ sự nguy hiểm của việc xóa là một lý do để cố gắng đưa ra một câu trả lời "con người" được định dạng tốt, mà còn giúp ích rất nhiều nếu bạn muốn thu thập một upvote.
peterh nói rằng phục hồi Monica

2

Có thể thử liên kết sau http://www.lessfs.com/wordpress/ nó hoạt động trên COW (sao chép trên ghi) sẽ tiết kiệm thời gian và không gian


lessfs rất thú vị, nhưng cũng rất thử nghiệm. Không khuyến khích sử dụng sản xuất.
mattdm

2

Đầu tiên tạo các thư mục chỉ trên đích:

rsync -av --include '*/' --exclude '*' /source/ /destination/

Sau đó, cứng liên kết các tập tin chỉ:

cd /source
find . -type f -exec ln -v {} /destination/{} \;

Cảm ơn - thực sự, tôi cũng có thể sử dụng paxnhư thể hiện trong nhận xét của tôi ở trên, có vẻ dễ dàng hơn.
Jean-Philippe Pellet

1

Sử dụng Tùy chọn -H để bảo vệ Liên kết cứng và đọc trang hướng dẫn.


1
-H không làm việc. Tôi không có liên kết cứng để bảo tồn trong cây nguồn của mình, tôi chỉ muốn một bản sao đơn giản của cây nguồn của mình trong đó trong bản sao, tất cả các tệp được liên kết cứng với các tệp gốc. Xin lỗi trong câu hỏi ban đầu của tôi là không rõ ràng
Jean-Philippe Pellet

"đọc trang" là một câu trả lời? :-)
meduz
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.