題 如何復制符號鏈接?


我有包含一些符號鏈接的目錄:

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

我需要將它們複製到當前目錄。生成的鏈接應獨立於其原型並直接指向其目標對象。

  • cp -s 創建指向不合適行為的鏈接的鏈接。
  • cp -s -L 拒絕複製目錄鏈接
  • cp -s -L -r 拒絕將相關鏈接複製到非工作目錄

我該怎麼辦?


156
2018-05-07 04:36


起源


cp -d 讓我的工作在我身邊。 - m-ric
cp -R 在Mac上 - Mirko


答案:


cp --preserve=links

從手冊頁:

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

就個人而言,我用 cp -av  對於我的大部分重複複製。這樣,我可以保存所有內容 - 甚至是遞歸 - 並查看輸出。當然,這只是個人偏好。

至於為什麼你的其他選擇沒有達到你的預期, -s 建立一個鏈接 代替 複製和 -L 跟踪源中的鏈接以查找要復制的文件,而不是複制鏈接本身。


174
2018-05-07 05:02



您可能需要添加 -R,因為否則cp會跳過目錄和符號鏈接到目錄。 - Olivier 'Ölbaum' Scherler
我在redhat上嘗試了這個,它不起作用 - Mansuro
在Mac上?使用 cp -a - Steve Tauber
+1為 -a 選項。嘿,我已經查找了選項 cp的手冊無數次,但我必須總是撇去這個。我一直在使用 -dpr但是 -a 涵蓋所有這些,以及保留其他幾個屬性。如果我需要這些其他屬性,我可能會查找 --preserve 選項再次使用 -dr --preserve=all,這正是什麼 -a 是!至少我現在知道了 - -a 是完美的,這是我將從現在開始使用的。 - James Haigh
這對Cygwin無效。 --preserve=links 還不夠。它仍然說 cp: omitting directory。但 -av 工作。 - Chloe


正如手冊頁所述,請使用 -P


34
2018-05-07 04:39



在Mac上 -P 不適用於我使用過的目錄 cp -a - Steve Tauber
謝謝,我已經看過你的答案,並且在一年中不同時間的3次受益。似乎無法記住它! - Siddhartha
這是有效的,但是我的手冊頁上寫著“-P永遠不會跟隨SOURCE中的符號鏈接”,這與“將符號鏈接複製到符號鏈接到目的地”不直觀相同。 (“永不跟隨”使它聽起來像是與-R組合使用) - R.M.
這個 cp -P 不像@kainosnous的最高投票回答對我有用。謝謝! - tommy.carstensen
適用於Redhat。接受的回應不起作用! - Phiber


如果鏈接包含相對路徑,則復制鏈接將不會調整相對路徑。 使用 readlink,用開關 -f 以遞歸方式跟隨,以獲得鏈接的絕對路徑。例如:

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

如果保留相對路徑是您想要的,那麼選項 -P 的 cp正如Ignacio Vazquez-Abrams所說,這就是你所需要的。


26
2018-05-07 05:09



如果你想要做的就是將符號鏈接從相對轉換為絕對符號,那麼遞歸取消引用可能是一個壞主意。這裡不需要遞歸,有時鍊式符號鏈接是有原因的。符號鏈接通常用於指定選項或配置選項。例如,在我的系統上有一個符號鏈 /usr/share/dict/words -> /etc/dictionaries-common/words -> /usr/share/dict/british-english 它指定首選字典。如果您以遞歸方式取消引用此鏈,則生成的符號鏈接將忽略此首選項的任何後續更改。 - James Haigh


少數人評論說:

cp -a 

效果很好。

來自男人:

-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

19
2018-01-27 14:51



...但僅當沒有符號鏈接到相對路徑時。 - Michael Scheper


我使用以下內容複製一個非常大的目錄。所有符號鏈接都被保留,副本以遞歸方式完成,我能夠獲得該過程的一些視覺反饋:

cp -Prv /sourcer_dir/* /target_dir

9
2018-05-15 17:25





大多數情況下,當我需要復制許多符號鏈接時,我實際上是在嘗試鏡像目錄樹。所以我想要符號鏈接和其他所有內容。

這對於復制幾個符號鏈接來說太過分了,但是如果你真的想要復制整個樹,這可能非常有用:

使用 柏油

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

柏油 默認情況下不解析符號鏈接,因此鏡像副本中的符號鏈接將指向與原始樹中的符號鏈接相同的位置。

這個技巧利用子殼來獲得 柏油 命令到要鏡像的目錄根目錄的位置;你可以留下其中一個(連同相關的 光盤 如果你已經在 SRC 要么 DEST 目錄:

# 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 - )'

同樣,這並不適合每次要復制符號鏈接,但它是一個非常有用的片段。


8
2018-05-07 06:03



根據我的經驗,tar絕對比cp更便攜 - don bright


嘗試: cp -pr 符號鏈接目的地

[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]# 

OS - Centos 5(Linux)


3
2017-07-27 13:15





在Ubuntu上複製目錄中的鏈接和文件時:

cp --no-dereference --preserve=links

1
2017-12-01 12:51



cp -d 是這方面的簡寫 - hunse