Sao chép symlink VÀ nơi nó trỏ đến sử dụng rsync


11

Nó không cần phải được thực hiện bởi rsync, nhưng thật tuyệt khi không phải viết một kịch bản để làm điều này, và rsyncrất gần với những gì tôi muốn.

rsync -a(hoặc -l) có thể bảo tồn các liên kết tượng trưng, ​​và -Lcó thể hủy bỏ các liên kết tượng trưng và sao chép nó như thể đó là tệp / thư mục bình thường. Tuy nhiên, có thể giữ liên kết tượng trưng và sao chép các tệp / thư mục mà các liên kết trỏ đến không?

Đây là một ví dụ. Nói rằng chúng tôi có hệ thống phân cấp thư mục này:

dirA/link_to_file -> ../dirB/file
dirA/link_to_dir -> ../dirC
dirB/file
dirB/not_this_file
dirC/file
dirC/file2
dirD/others

và khi tôi làm rsync -aR dirA dest(hoặc một cái gì đó khác), tôi muốn có chính xác những thứ này xuất hiện trong dest:

dirA/link_to_file -> ../dirB/file
dirA/link_to_dir -> ../dirC
dirB/file
dirC/file
dirC/file2

Điều này có thể với rsync? Cảm ơn bạn.

Giả sử các liên kết tượng trưng có đường dẫn tuyệt đối hoặc trỏ đến bên ngoài thư mục nguồn có thể bị bỏ qua.


1
Tôi nghĩ rằng yêu cầu của bạn chưa được xác định rõ: bạn yêu cầu nếu dirA/linklà một liên kết tượng trưng ../dirB/file, thì điều này nên được xử lý như sao chép dirB/filevào dest/dirB/filedirA/linkđến dest/dirA/link. Điều gì nếu dirA/linklà một liên kết đến ../../another_file? Điều gì xảy ra, nói chung, nếu dirA/linktrỏ đến một thư mục cao hơn trong cây thư mục?
Riccardo Murri

Nắm bắt tốt. Trong trường hợp sử dụng của tôi, không có điểm liên kết nào bên ngoài cây và không có đường dẫn tuyệt đối trong các liên kết.
Wei-Yin

1
Tôi càng nghĩ về nó, tôi càng nghĩ rằng không có tiện ích tiêu chuẩn nào sẽ làm được điều này. Trong trường hợp tổng quát, nó có thể cần phải tạo ra một số lượng lớn các địa điểm cung cấp một nguồn duy nhất, nếu bạn có một liên kết tượng trưng đến một liên kết tượng trưng hay rộng hơn một liên kết tượng trưng mà mục tiêu có chứa một liên kết tượng trưng (ví dụ a -> b, b -> c/foo, c -> d/e: yêu cầu bản sao acũng nên sao chép b, c, c/foo, d, d/ed/e/foo).
Gilles 'SO- ngừng trở nên xấu xa'

@Gilles: Vâng, bạn nói đúng. Liên kết theo dõi có thể dẫn đến bao gồm rất nhiều tệp, miễn là chúng vẫn nằm trong thư mục nguồn.
Wei-Yin

Câu trả lời:


2

Nếu bạn biết tên symlink và muốn chuyển liên kếtmục tiêu bạn có thể:

rsync -a 'symlink' .
realdir="$(basename "$(readlink -f 'symlink')")"
rsync -a "$realdir" .

Việc rsyncchuyển đầu tiên chỉ là symlink. Lệnh thứ hai tìm thấy tên thư mục thực và lệnh thứ hai rsyncchuyển nội dung thư mục.


0

Điều này có thể xảy ra nếu và chỉ khi bạn hoàn toàn nằm trong 'mydir' và bạn đã rsync 'mydir' từ nơi này sang nơi khác. Rsync không có khả năng sao chép bên ngoài đường dẫn bạn đưa ra (ngoại trừ các liên kết sau). ví dụ

mydir/dirA ...
mydir/dirB ...
...

Vâng, giả định này phù hợp với trường hợp sử dụng của tôi. Tất cả các liên kết là bên trong mydir.
Wei-Yin

@ Wei-Yin sau đó chỉ cần nói với nó là không theo symlink ... hoặc tôi đã hiểu nhầm điều gì đó
xenoterracide

@xenoterracide: Bất kể bạn gọi rsync như thế nào, tôi nghĩ rằng nó sẽ tạo một đích duy nhất cho mỗi nguồn (ngoài việc tạo các thư mục hàng đầu). Nhưng Wei-Yin muốn tạo ra hai hoặc nhiều điểm đến: liên kết mục tiêu của nó.
Gilles 'SO- ngừng trở nên xấu xa'

hình như tôi đang bối rối ...
xenoterracide

@Gilles: không cần rsync theo liên kết tượng trưng, ​​vì dù sao nó cũng sẽ đồng bộ hóa mục tiêu . Vì vậy, đầu tiên nó sao chép symlink, tạo một symlink lơ lửng. Sau đó, nó tiếp tục sao chép mọi thứ khác trong thư mục, bao gồm cả mục tiêu của symlink. Voila, mọi thứ đều khớp với nhau một cách độc đáo.
Martin v. Löwis
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.