2010-05-07 04:36:38 +0000 2010-05-07 04:36:38 +0000
188
188

如何复制符号链接?

我有一个目录,其中包含一些符号链接:

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拒绝复制相对链接到非工作目录

我该怎么办?

答案 (10)

212
212
212
2010-05-07 05:02:45 +0000

这样,我可以保存所有的东西–甚至是递归–并看到输出。当然,这只是个人喜好。

至于为什么你的其他选项没有达到你的预期效果,cp -av做了一个链接,而不是复制,-s按照源文件中的链接找到要复制的文件,而不是复制链接本身。

47
47
47
2010-05-07 04:39:24 +0000

就像男人页面上说的那样,用-P

30
30
30
2010-05-07 05:09:01 +0000

如果链接中包含相对路径,那么,复制链接不会调整相对路径。使用readlink,用开关-f进行递归跟随,以获得链接的绝对路径。例如:

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

如果你想要的是保留相对路径,那么-P中的cp选项就是你所需要的,就像Ignacio Vazquez-Abrams所说的那样。

24
24
24
2015-01-27 14:51:13 +0000

正如一些人所评论的那样:

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
11
11
11
2012-05-15 17:25:32 +0000

我用下面的方法复制了一个非常大的目录。所有的符号链接都被保留了下来,复制的过程是递归进行的,而且我能够对复制过程有一些直观的反馈:

cp -Prv /sourcer_dir/* /target_dir
11
11
11
2010-05-07 06:03:32 +0000

大多数时候,当我需要复制许多符号链接时,我实际上是想镜像一棵目录树。

如果只是复制几个符号链接,这对于复制几个符号链接来说是多余的,但如果你想复制一整棵树,这个方法可能非常有用:

使用tar

这个技巧利用子壳来让tar命令在要镜像的目录根目录中的位置;如果你已经在srcdest目录中,你可以省去其中一个(和相关的cd命令一起):

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

同样,这并不适合于每次复制符号链接的时候,但这是一个非常有用的片段。

4
4
4
2011-07-27 13:15:51 +0000

试试: cp -pr symlink destination

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

操作系统 - Centos 5 (Linux)

3
3
3
2015-12-01 12:51:43 +0000

在Ubuntu上复制目录中的链接和文件时:

cp --no-dereference --preserve=links
2
2
2
2019-01-12 17:55:13 +0000

使用-P选项,正如Ignacio Vazquez-Abrams在上面写的。他没有提到的是-P没有-R就没有效果,所以你至少需要cp -RP。所以你至少需要&007。

(网站还不让我评论,所以我另发了一个答案。)

1
1
1
2018-06-26 03:24:57 +0000

cp -s 和 cp -L 是特殊命令。对于你的需求,请使用无。

例如:复制一个包含a和指向a的符号链接b的目录DIR。 ./DIR/b),这是链接到一个链接的链接。我相信这也是cp的默认值。

-P no-deference,保留链接 -d结合-P选项和-p来保留=mode,ownership,timestamps -a结合-d选项和-R来递归复制目录

参考man cpcp --help的更多选项。