cp复制软链接失效的原因

在学习cp命令时我们会知道复制软链接时,如果要保留链接文件使用-d,但当我们实际操作时却常常出现如下
情况

[root@localhost ~]# ls -l /etc/redhat-release     #此文件为链接文件 lrwxrwxrwx. 1 root root 14 Oct 17 08:48 /etc/redhat-release -> centos-release  
[root@localhost ~]# cp -d /etc/redhat-release /root/redhat.s   #使用-d 保存链接文件属性 
[root@localhost ~]# ls -l /root/redhat.s            #查看可知centos-release是闪烁的,也就是不存在 
lrwxrwxrwx 1 root root 14 Oct 22 09:06 /root/redhat.s -> centos-release  
[root@localhost ~]# cat /root/redhat.s    #看不了/root/redhat.s链接文件 cat: /root/redhat.s: No such file or directory

为什么我们使用cp -d 复制链接文件会失败?那就要看cp -d 是如何复制软链接的。在上例中,我们打算将
/etc/redhat-release软链接复制到/root/redhat.s。在使用cp -d实际上是将原软链接中指针区代表原文件
路径的字符串拷贝到新创建的/root/redhat.s中
下面命令可以看出其文件大小都为14,即centos-release
字符串大小

[root@localhost ~]# ls -l /etc/redhat-release /root/redhat.s  
lrwxrwxrwx. 1 root root 14 Oct 17 08:48 /etc/redhat-release -> centos-release lrwxrwxrwx  
1 root root 14 Oct 22 09:06 /root/redhat.s -> centos-release

当我们查看新建软链接/root/redhat.s时看到原文件路径是centos-release,就会到当前路径(/root/)
上查看centos-release文件,而实际上原文件在/etc/目录下,所以查看/root/redhat.s才会出现
/root/redhat.s: No such file or directory的错误。
根据这个原理我们可以推断,如果原链接文件存的是原文件的绝对路径的话,新建的链接文件就能找到原文件而不是报错,接下来我们实验一下。

#1. 先创建一个软链接/etc/redhat-release2,可知数据区存的是原文件的绝对路径/etc/centos-release 
[root@localhost ~]# ln -s /etc/centos-release /etc/redhat-release2 
[root@localhost ~]# ls -l /etc/redhat-release2 lrwxrwxrwx 1 root root 19 Oct 22 09:37 /etc/redhat-release2 -> /etc/centos-release  
#2. 复制刚创建的软链接/etc/redhat-release2到/root/radhat2.s 
[root@localhost ~]# cp -d /etc/redhat-release2 /root/radhat2.s 
[root@localhost ~]# ls -l /root/radhat2.s lrwxrwxrwx 1 root root 19 Oct 22 09:41 /root/radhat2.s -> /etc/centos-release  
#3. 查看新软链接内容 
[root@localhost ~]# cat /root/radhat2.s CentOS release 6.7 (Final)

cp -d 复制软链接时总结

1. 当原链接文件中存的是原文件的绝对路径:创建的新链接文件可在任何路径下。
2. 当原链接文件中存的是原文件的相对路径:
    例1:
        新链接文件在/root/link2
        相对路径是 centos (来自原链接文件的指针数据区)
        那么/root/centos就是原文件路径
    例2:
        新链接文件为/root/test/link2
        相对路径为../centos
        那么/root/centos为原文件路径
    原文件路径找得到就ok,找不到就报错。

原创文章,作者:lirou,如若转载,请注明出处:http://www.178linux.com/53450

(3)
liroulirou
上一篇 2016-10-25
下一篇 2016-10-25

相关推荐

  • Nginx

        Nginx(发音同engine x)是一个 Web服务器,也可以用作反向代理,负载平衡器和 HTTP缓存。Nginx 可以部署在网络上使用 FastCGI,脚本,SCGI 处理程序,WSGI 应用服务器或 Phusion 乘客模块的动态 HTTP 内容,并可作为软件负载均衡器。Nginx 使…

    Linux干货 2017-08-29
  • 题外:自制小linux

    自制小linux 系统 制作环境的概述 首先你的有VMware的虚拟机软件,其次安装了centos6/centos7的linux系统 而且你需要写一个复制相关命令以及依赖库文件的的脚本(主要是为了省时间,脚本写法会在后面备注)准备好以上环境,便可以制作一个小linux系统了,具体步骤如下 1)  在虚拟机设置中,在原有基础上在挂载一个20G大小的硬…

    2017-04-04
  • 从需求和安全角度开始linux(一)-20151211

    突然想从需求和安全的角度来展开各种命令。因为我觉得linux中所有的常用命令基本都是需求和安全的产物。 当我打开一个CLI(command line interface)界面的linux操作系统时: 一、我希望能够看到里面有什么,因此有了ls的命令。      ls – list&nbs…

    Linux干货 2015-12-15
  • Mysql 报错解决–PID file could not be found!

    今天想把之前在cetnos6上编译安装的mariadb改下PATH环境变量,操作几次之后,关闭或重启mysql就失败了,提示如下: [root@web1 ~]# service mysqld stop MySQL server PID file could not&nb…

    系统运维 2016-09-19
  • 文件查找命令find

      在文件系统上常常需要根据文件的各种属性去查找符合条件的文件。在Linux下也有相当优异的查找命令。今天只要将find和locate。find通常不常用,因为速度慢!通常我们先使用locate来进行模糊查找,如果真找不到了,才以find来查找。为什么呢?因为locate是利用数据库来查找数据,所以速度非常快,而且并没有实际查询硬盘比较省时间。 l…

    Linux干货 2016-08-22
  • shell编程、程序包管理及习题

    shell编程、程序包管理及习题 一、编程语句 1、while 循环 while CONDITION; do     循环体 done CONDITION :循环控制条件;进入循环之前,先做一次判 断;每一次循环之后会再次做判断;条件为“true” ,则执行 一次循环;直到条件测试状态为“false” 终止循环 因此:…

    Linux干货 2016-08-18