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
会按照源代码中的链接来查找文件复制而不是复制链接本身。评论
您可能需要添加-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 cp
或cp --help
。
评论
cp -d胜任了我的工作。在Mac上的cp -R