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

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拒绝将相对链接复制到无效的目录

我该怎么办?

评论

cp -d胜任了我的工作。

在Mac上的cp -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会按照源代码中的链接来查找文件复制而不是复制链接本身。

评论


您可能需要添加-R,因为否则cp会跳过目录和指向目录的符号链接。

–奥利维尔·奥尔巴姆·舍勒(Olivier'Ölbaum)Scherler
13年4月19日在8:25



我在redhat上尝试了它,但是不起作用

– Mansuro
13年5月27日在7:57

在Mac上?使用cp -a

–史蒂夫·陶伯(Steve Tauber)
2013年9月19日17:52

+1 -a选项。嘿,我已经无数次地在cp的联机帮助页中查找选项,但是我必须总是略过这一页。到目前为止,我一直在使用-dpr,但是-a涵盖了所有这些内容,另外还保留了一些其他属性。如果我需要这些其他属性,我可能会再次查找--preserve选项,并使用-dr --preserve = all,这恰好是-a!好吧,至少我现在知道– -a很完美,这就是我从现在开始将要使用的。

–詹姆斯·海格(James Haigh)
2014年8月20日3:00在

这在Cygwin上不起作用。 --preserve =链接还不够。它仍然说cp:省略目录。但是-av有效。

– Chloe
15年8月19日在22:23

#2 楼

就像手册页说的那样,请使用-P。此设置显示:
-P, --no-dereference
       never follow symbolic links in SOURCE


评论


在Mac上-P在目录上不起作用,所以我使用cp -a

–史蒂夫·陶伯(Steve Tauber)
2013年9月19日17:52

谢谢,我一年以来有3次见过您的答案,并从中受益。似乎不记得了!

–悉达多
2014年5月1日下午16:52

这行得通,但是我的手册页上说“ -P在源代码中永不遵​​循符号链接”,这在直观上与“将符号链接复制为指向目标的符号链接”不同。 (“从不跟随”听起来像它与-R结合使用)

– R.M.
16年7月7日在19:00

这个cp -P与@kainosnous为我工作的最高投票答案不同。谢谢!

–tommy.carstensen
17年1月3日,11:48

在Redhat上工作。接受的响应不起作用!

–光纤
17年4月21日在15:59

#3 楼

如果链接包含相对路径,则复制链接不会调整相对路径。
使用readlink,并使用开关-f递归跟随,以获取链接的绝对路径。例如:

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


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

评论


如果您要做的只是将符号链接从相对链接转换为绝对链接,那么递归地取消引用可能是个坏主意。这里不需要递归,有时存在链接的符号链接是有原因的。符号链接通常用于指定选项或配置选项。例如,在我的系统上,有一个符号链接链/ usr / share / dict / words-> / etc / dictionaries-common / words-> / usr / share / dict / british-english指定首选的字典。如果要递归地取消引用此链,则生成的符号链接将忽略此首选项的任何将来更改。

–詹姆斯·海格(James Haigh)
2014年8月20日下午3:35

#4 楼

正如一些评论者所述:

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


评论


...,但前提是没有任何符号链接指向相对路径。

– Michael Scheper
16-10-30在21:27

#5 楼

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

这对于复制几个符号链接来说是过大的,但是如果您实际上是在复制整个树,这可能非常有用:

使用tar。

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


tar默认不会解析符号链接,因此镜像副本中的符号链接将指向与tar中相同的位置。

此技巧利用子外壳使tar命令位于要镜像的目录的根位置;如果您已经在src或dest目录中,则可以忽略其中之一(以及相关的cd命令):

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


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

评论


根据我的经验,tar绝对比cp更可移植

–不要亮
17年8月31日在1:31

#6 楼

我使用以下命令来复制一个非常大的目录。所有符号链接均被保留,该副本是递归完成的,我能够对该过程进行一些视觉反馈:

cp -Prv /sourcer_dir/* /target_dir


#7 楼

尝试:
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)

#8 楼

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

cp --no-dereference --preserve=links


评论


cp -d是此的简写

– hunse
16年5月30日在18:29

我认为cp -a和cp --preserve = links都比问题提出的要多。据我了解,这是使用cp的任何人的正确答案,尽管像问题中那样仅使用文件(没有目录),--no-dereference无效。

–palswim
19年2月4日在6:10

#9 楼

使用-P选项,如上文Ignacio Vazquez-Abrams所述。他没有提到的是-P没有-R就没有效果。因此,您至少需要cp -RP

(该网站尚未允许我发表评论,所以我发布了单独的答案。)

评论


在旧的solaris框上,我的cp不支持-d。 cp -rP为我工作; (idk -R和-r之间的差异,-r对我有用)。

–蜘蛛
19-09-18在12:45

#10 楼

cp -s和cp -L是特殊命​​令。根据您的要求,不使用任何内容。

例如复制目录DIR,其中包含a和指向a的符号链接b。


cp -s DIR / * N /创建符号链接而不是复制N / a-> ../ DIR / a(链接)和N / b->(。 ./DIR/b)链接到链接
cp -L DIR / * N /复制,带有链接取消引用,N / a,N / b(与DIR / a相同)

您需要的是N / a(= DIR / a)和N / b-> ../ N / a;因此,只需使用cp -P选项复制而不取消引用即可。我相信这也是cp的默认设置。


-P无引用,保留链接
-d结合使用-P选项和-p来保存= mode,所有权,时间戳
-a结合-d -R选项以递归方式复制目录

有关更多选项,请参考man cpcp --help