Làm thế nào để sao chép cấu trúc thư mục mà không cần gỡ bỏ liên kết tượng trưng?


27

Tôi cần "cài đặt" một loạt các tệp vào một thư mục khác để giữ nguyên cấu trúc thư mục của các tệp nguồn. Ví dụ, nếu tôi phải ./foo/bar/baz.txtđi, /var/www/localhost/webroot/tôi muốn kết quả đạt được /var/www/localhost/webroot/foo/bar/baz.txt. rsynccó khả năng này --relative, nhưng khi tôi làm điều này, tôi phát hiện ra nó không thân thiện với các liên kết tượng trưng:

$ ls -ald /var/www/localhost/webroot/ | grep ^l
lrwxrwxrwx  1 www-data www-data     15 2014-01-03 13:45 media -> ../static/media
lrwxrwxrwx  1 root     root         13 2014-02-24 13:47 var -> ../static/var
$ rsync -qrR . /var/www/localhost/webroot/
$ ls -ald /var/www/localhost/webroot/ | grep var
drwxr-xr-x 3 root root 4096 2014-02-24 13:52 /var/www/localhost/webroot/var

Vì vậy, bạn thấy symlink không còn là symlink - các tệp đã được sao chép sai vị trí!

rsynccũng có --no-implied-dirstùy chọn, bề ngoài dường như làm những gì tôi muốn, nhưng nó chỉ hoạt động như tôi dự định khi không thực hiện rsync đệ quy, vì vậy tôi phải:

find . -type f -print0 | xargs -0I{} rsync -R --no-implied-dirs {} /var/www/localhost/webroot/

Có cách nào trực tiếp hơn để thực hiện phản chiếu tệp này mà không xóa sạch các thư mục symlink trung gian (có hoặc không có rsync) không?

Câu trả lời:


42

Sử dụng rsynctùy chọn -K( --keep-dirlinks). Từ trang hướng dẫn:

 -K, --keep-dirlinks
      This  option  causes  the  receiving side  to  treat  a
      symlink  to  a  directory  as though  it  were  a  real
      directory, but only if it matches a real directory from
      the  sender.   Without   this  option,  the  receiver’s
      symlink  would  be deleted  and  replaced  with a  real
      directory.

      For example, suppose you  transfer a directory foo that
      contains a file file, but foo is a symlink to directory
      bar  on  the  receiver.  Without  --keep-dirlinks,  the
      receiver  deletes  symlink  foo,   recreates  it  as  a
      directory,  and   receives  the   file  into   the  new
      directory.   With --keep-dirlinks,  the receiver  keeps
      the symlink and file ends up in bar.

      One note  of caution:  if you  use --keep-dirlinks, you
      must  trust all  the symlinks  in the  copy!  If  it is
      possible  for an  untrusted  user to  create their  own
      symlink to  any directory,  the user  could then  (on a
      subsequent  copy)  replace  the  symlink  with  a  real
      directory and affect the  content of whatever directory
      the  symlink references.   For backup  copies, you  are
      better off using something like a bind mount instead of
      a symlink to modify your receiving hierarchy.

      See also  --copy-dirlinks for  an analogous  option for
      the sending side.

16

Tôi muốn giữ gìn liên kết tượng trưng của mình dưới dạng liên kết tượng trưng. Cho rằng bạn có thể sử dụng tùy chọn -l.

    -l, --links                 copy symlinks as symlinks

Vì tôi đã sao chép các khung công tác trên OS X, tôi thấy điều này hữu ích.


3

Vui lòng sử dụng -a, vì nó ngụ ý -lnhư được cho là ở trên. Nhưng nó cũng chứa các tùy chọn quan trọng khác nếu bạn muốn có một bản sao hoàn chỉnh của nguồn.

Ngoài ra: Theo tôi hiểu trang man, -Kcó nghĩa là cho các liên kết tượng trưng ở phía người nhận. Tôi không nghĩ rằng đây sẽ là câu trả lời chính xác ở đây.


2

Là một rsynccâu trả lời không , tartiện ích có thể thực hiện nhiệm vụ này. Sử dụng hai trường hợp tarở hai bên của một đường ống, lần đầu tiên để sử dụng cấu trúc thư mục và lần thứ hai để trích xuất nó ở nơi khác. Quyền sở hữu tệp của bản sao có thể sẽ thay đổi, trong khi các chế độ cho phép có thể sẽ không thay đổi.

Nhiều ví dụ tồn tại và tôi đã tìm thấy các đề xuất trong câu trả lời này tương đối nhanh chóng: https://unix.stackexchange.com/a/59108 432251 .

Chỉnh sửa
Ví dụ thứ hai (ngắn gọn hơn?): Https://unix.stackexchange.com/a/19824 432251 .

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.