如何复制符号链接?

如何复制符号链接?

我有一个包含一些符号链接的目录:

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

我应该怎么办?

答案1

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按照源中的链接查找要复制的文件,而不是复制链接本身。

答案2

正如手册页所述,使用-P。此设置表示:

-P, --no-dereference
       never follow symbolic links in SOURCE

答案3

正如一些人评论的那样:

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

答案4

大多数情况下,当我需要复制许多符号链接时,我实际上是在尝试镜像目录树。所以我需要符号链接和其他所有内容。

对于复制几个符号链接来说,这是小菜一碟,但如果你实际上想复制整个树,那么这会非常有用:

使用柏油

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

柏油默认情况下不解析符号链接,因此镜像副本中的符号链接将指向与原始树中相同的位置。

这个技巧利用子 shell 来获取柏油命令放到要镜像的目录的根目录下;你可以省略其中一个(以及相关的光盘命令)如果你已经在源码或者目的地目录:

# 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 [email protected] '( cd /path/to/dest ; tar xf - )'

再次强调,这并不适合您每次想要复制符号链接,但这是一个非常有用的代码片段。

相关内容