Câu hỏi Làm thế nào để sao chép các liên kết tượng trưng?


Tôi có thư mục chứa một số liên kết tượng trưng:

user@host:include$ find .. -type l -ls
4737414    0 lrwxrwxrwx   1 user group       13 Dec  9 13:47 ../k0607-lsi6/camac -> ../../include
4737415    0 lrwxrwxrwx   1 user group       14 Dec  9 13:49 ../k0607-lsi6/linux -> ../../../linux
4737417    0 lrwxrwxrwx   1 user group       12 Dec  9 13:57 ../k0607-lsi6/dfc -> ../../../dfc
4737419    0 lrwxrwxrwx   1 user group       17 Dec  9 13:57 ../k0607-lsi6/dfcommon -> ../../../dfcommon
4737420    0 lrwxrwxrwx   1 user group       19 Dec  9 13:57 ../k0607-lsi6/dfcommonxx -> ../../../dfcommonxx
4737421    0 lrwxrwxrwx   1 user group       17 Dec  9 13:57 ../k0607-lsi6/dfcompat -> ../../../dfcompat

Tôi cần sao chép chúng vào thư mục hiện tại. Các liên kết kết quả phải độc lập với các nguyên mẫu của chúng và dẫn trực tiếp đến các đối tượng đích của chúng.

  • cp -s tạo liên kết đến các liên kết không phải là hành vi thích hợp.
  • cp -s -L từ chối sao chép liên kết đến thư mục
  • cp -s -L -r từ chối sao chép liên kết tương đối vào thư mục không hoạt động

Tôi nên làm gì?


149
2018-05-07 04:36


gốc


cp -d thực hiện công việc ở bên cạnh tôi. - m-ric
cp -R trên một mac - Mirko


Các câu trả lời:


cp --preserve=links

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

   --preserve[=ATTR_LIST]
          preserve  the   specified   attributes   (default:   mode,owner-
          ship,timestamps),  if  possible  additional attributes: context,
          links, xattr, all

Cá nhân, tôi sử dụng cp -av  cho hầu hết các bản sao nặng của tôi. Bằng cách đó, tôi có thể bảo toàn mọi thứ - thậm chí đệ quy - và xem đầu ra. Tất nhiên, đó chỉ là sở thích cá nhân.

Về lý do tại sao các tùy chọn khác của bạn không làm những gì bạn mong đợi, -s tạo liên kết thay thế sao chép và -L theo các liên kết trong nguồn để tìm tệp để sao chép thay vì sao chép các liên kết.


167
2018-05-07 05:02



Bạn có thể cần phải thêm -R, bởi vì nếu không cp sẽ bỏ qua các thư mục và các liên kết đến các thư mục. - Olivier 'Ölbaum' Scherler
Tôi đã thử điều này trên redhat và nó không hoạt động - Mansuro
trên máy Mac? sử dụng cp -a - Steve Tauber
+1 cho -a Tùy chọn. Heh, tôi đã tra cứu các tùy chọn trong cpmanpage của vô số lần, nhưng tôi phải luôn luôn lướt qua này. Tôi có cho đến bây giờ đã được sử dụng -dpr, nhưng -a bao gồm tất cả những điều đó, cộng với việc bảo tồn một vài thuộc tính khác. Nếu tôi cần những thuộc tính khác, tôi có lẽ đã tra cứu --preserve tùy chọn một lần nữa và được sử dụng -dr --preserve=all, đó là chính xác những gì -a Là! Ít nhất tôi biết bây giờ - -a là hoàn hảo và đây là những gì tôi sẽ sử dụng từ bây giờ. - James Haigh
Điều này đã không làm việc trên Cygwin. --preserve=links không đủ. Nó vẫn nói cp: omitting directory. Nhưng -av đã làm việc. - Chloe


Đúng như trang người đàn ông nói, sử dụng -P.


33
2018-05-07 04:39



trên máy Mac -P không hoạt động trên các thư mục vì vậy tôi đã sử dụng cp -a - Steve Tauber
Cảm ơn, tôi đã nhìn thấy và hưởng lợi từ câu trả lời của bạn 3 lần vào những thời điểm khác nhau trong một năm. Có vẻ như không nhớ nó! - Siddhartha
Điều này làm việc, nhưng trang người đàn ông của tôi nói "-P không bao giờ theo các liên kết tượng trưng trong SOURCE", mà không trực giác giống như "sao chép các liên kết như các liên kết đến đích". ("không bao giờ theo dõi" làm cho nó có vẻ như nó hoạt động kết hợp với -R) - R.M.
Điều này cp -P không giống như câu trả lời bình chọn hàng đầu của @kainosnous hoạt động cho tôi. Cảm ơn! - tommy.carstensen
Hoạt động trên Redhat. Phản hồi được chấp nhận không hoạt động! - Phiber


Nếu các liên kết chứa đường dẫn tương đối, thì sao chép liên kết sẽ không điều chỉnh đường dẫn tương đối. Sử dụng readlink, với công tắc -f theo dõi đệ quy, để có được đường dẫn tuyệt đối của liên kết. Ví dụ:

ln -s $(readlink -f old/dir/oldlink) new/dir/newlink

Nếu bảo quản đường dẫn tương đối là những gì bạn muốn, hơn tùy chọn -P của cp, như Ignacio Vazquez-Abrams đã nói, là những gì bạn cần.


26
2018-05-07 05:09



Nó có thể là một ý tưởng tồi để dereference đệ quy nếu tất cả các bạn đang cố gắng làm là để chuyển đổi các liên kết từ liên quan đến tuyệt đối. Các đệ quy là không cần thiết ở đây, và đôi khi chuỗi liên kết bị chặn là có một lý do. Các liên kết tượng trưng thường được sử dụng để chỉ định lựa chọn hoặc tùy chọn cấu hình. Ví dụ, trên hệ thống của tôi có một chuỗi liên kết tượng trưng /usr/share/dict/words -> /etc/dictionaries-common/words -> /usr/share/dict/british-english chỉ định từ điển ưa thích. Nếu bạn đã đệ quy dereference chuỗi này, các liên kết tượng trưng sẽ bỏ qua bất kỳ thay đổi trong tương lai để sở thích này. - James Haigh


Như một vài người đã bình luận:

cp -a 

hoạt động tốt.

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

-a    same as -dR --preserve=all

-R    copy directories recursively
-d    same as --no-dereference --preserve=links
--no-dereference   never follow symbolic links in SOURCE

17
2018-01-27 14:51



... nhưng chỉ khi không có liên kết tượng trưng nào là đường dẫn tương đối. - Michael Scheper


Tôi đã sử dụng phần sau để sao chép một thư mục thực sự lớn. Tất cả các liên kết tượng trưng được bảo tồn, bản sao được thực hiện một cách đệ quy và tôi có thể có một số phản hồi trực quan về quá trình:

cp -Prv /sourcer_dir/* /target_dir

9
2018-05-15 17:25





Hầu hết thời gian, khi tôi cần phải sao chép nhiều liên kết tượng trưng, ​​tôi thực sự đang cố gắng để phản chiếu một cây thư mục. Vì vậy, tôi muốn các liên kết tượng trưng và mọi thứ khác.

Đây là quá mức cần thiết để sao chép chỉ một vài liên kết tượng trưng, ​​nhưng nếu bạn đang thực sự cố sao chép toàn bộ cây, điều này có thể rất hữu ích:

Sử dụng tar.

user@host:/cwd$ ( cd /path/to/src ; tar cf - . ) | ( cd /path/to/dest ; tar xf - )

tar không giải quyết liên kết tượng trưng theo mặc định, vì vậy các liên kết tượng trưng trong bản sao sẽ trỏ đến các vị trí giống với các vị trí trong cây gốc.

Bí quyết này sử dụng subshells để có được tar lệnh vào vị trí tại thư mục gốc của thư mục được nhân đôi; bạn có thể để một trong số chúng ra (cùng với CD lệnh) nếu bạn đã ở trong src hoặc là dest thư mục:

# already in src?
user@host:/src$ tar cf - . | ( cd /path/to/dest ; tar xf - )

# already in dest?
user@host:/dest$ ( cd /path/to/src ; tar cf - . ) | tar xf - 

# just need src/foo?
# this result will be a mirror copy at dest/foo 
user@host:/src$ tar cf - foo | ( cd /path/to/dest ; tar xf - )

# mirror to another system?
user@host:/src$ tar cf - . | ssh user@example.com '( cd /path/to/dest ; tar xf - )'

Một lần nữa, điều này không thích hợp cho mỗi lần bạn muốn sao chép các liên kết tượng trưng, ​​nhưng nó là một đoạn mã rất hữu ích cần biết.


8
2018-05-07 06:03



tar chắc chắn là di động hơn cp trong kinh nghiệm của tôi - don bright


Thử: cp -pr điểm đến liên kết tượng trưng

[root@station1 temp]# ls -l
total 8
-rw-r--r-- 1 root root  0 Jul 27 18:40 abc
lrwxrwxrwx 1 root root 13 Jul 27 18:41 abc.link1 -> /tmp/temp/abc
[root@station1 temp]# cp -rp /tmp/temp/abc.link1 /tmp/temp/abc.link2
[root@station1 temp]# ls -l
total 12
-rw-r--r-- 1 root root  0 Jul 27 18:40 abc
lrwxrwxrwx 1 root root 13 Jul 27 18:41 abc.link1 -> /tmp/temp/abc
lrwxrwxrwx 1 root root 13 Jul 27 18:42 abc.link2 -> /tmp/temp/abc
[root@station1 temp]# 

Hệ điều hành - CentOS 5 (Linux)


3
2017-07-27 13:15





Trên Ubuntu khi sao chép các liên kết và tệp trong một thư mục:

cp --no-dereference --preserve=links

1
2017-12-01 12:51



cp -d là viết tắt của điều này - hunse


cp -s và cp -L là các lệnh đặc biệt. Đối với yêu cầu của bạn, không sử dụng.

ví dụ. Sao chép thư mục DIR chứa một và một liên kết tượng trưng b trỏ đến a.

  • cp-DIR / * N / tạo liên kết tượng trưng thay vì sao chép, N / a -> ../ DIR / a (liên kết) và N / b -> (../ DIR / b) là liên kết tới một liên kết
  • cp -L DIR / * N / bản sao với dereferencing liên kết, N / a, N / b (giống như DIR / a)

Những gì bạn cần là N / a (= DIR / a), và N / b -> ../ N / a; vì vậy chỉ cần sao chép mà không có dereferencing, sử dụng tùy chọn cp-P. Tôi tin rằng đây cũng là mặc định cho cp.

  • -P không-dereference, giữ liên kết
  • -d kết hợp tùy chọn -P với -p để bảo toàn = chế độ, quyền sở hữu, dấu thời gian
  • -a kết hợp -d tùy chọn với -R để đệ quy sao chép thư mục

tham khảo man cp hoặc là cp --help để có thêm tùy chọn.


0
2018-06-26 03:24