我有一个包含一些符号链接的目录:
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 - )'
再次强调,这并不适合您每次想要复制符号链接,但这是一个非常有用的代码片段。