Linux 学习笔记 cp 和 ln
最近在重温大学的经典课程:Linux。每天工作之余的时间,坐在家里的阳台上,简简单单的纪录一些基本的知识点,对我来说,既温暖又难得。
有朋友问我关于cp和ln建立符号链接(软链接)和硬链接的一些问题,在这里做个记录。
cp 命令
基本用法:
cp source destination
该命令将source复制至一个新文件,叫destination。注意,这种复制,是真实将源文件内容拷贝了一份,存在了物理存储空间。
我们使用命令ls -il来显示文件的长列表,会发现destination与source有不同的索引节点号(索引节点是内核分配给文件系统中每个对象的唯一标识数字)。
root@iZ28eyzqmtxZ:~# ls
jdk log.txt
root@iZ28eyzqmtxZ:~# cp log.txt log2.txt
root@iZ28eyzqmtxZ:~# ls -il
total
drwxr-xr-x root root Jun : jdk
-rw-r--r-- root root Jul : log2.txt
-rw-r--r-- root root Jun : log.txt
root@iZ28eyzqmtxZ:~#
cp命令有很多参数,可以进行诸如递归复制整个目录中的所有内容等。相关参数可以参看Linux编程大全。
这里要解释的是-l和-s两个参数。
-l:创建文件链接(硬链接)而非复制文件
-s:创建一个符号链接(软链接)而非复制文件
虽然没有看过Linux的源码,但是可以推断出这边用到了c中的两个特性:指针,指针的指针。
我们知道操作系统在进行存储管理的时候,会为文件存储的物理空间的起点标识一个确定的“地址”,而我们所见的文件名,其实在存储空间中,存储的是真实源文件的“地址”,这个地址指向了源文件的真实存储空间。

如上图,存储空间A和存储空间B可能是相邻的存储空间,也可能不是,但它们一定是两个存储空间存了相同的内容。
再看硬链接的图:

也就是说我们如果执行的是 cp -l log.txt log2.txt,实际上并没有创建一份新的源文件,只是对存储空间A新加了一个指向它的指针。
root@iZ28eyzqmtxZ:~# ls
jdk log2.txt log.txt
root@iZ28eyzqmtxZ:~# ls -il
total
drwxr-xr-x root root Jun : jdk
-rw-r--r-- root root Jul : log2.txt
-rw-r--r-- root root Jun : log.txt
root@iZ28eyzqmtxZ:~# cp -l log.txt log3.txt
root@iZ28eyzqmtxZ:~# ls -il
total
drwxr-xr-x root root Jun : jdk
-rw-r--r-- root root Jul : log2.txt
-rw-r--r-- root root Jun : log3.txt
-rw-r--r-- root root Jun : log.txt
root@iZ28eyzqmtxZ:~#
可见,log.txt和log3.txt公用同一个索引节点号:787737,而且它们俩的硬链接总数都变成了2。即存储空间A有两个指向它的指针。
这样一来,无论我们是查找log.txt还是log3.txt,都会先找到它们代表的0xA300的存储空间,接着便能找到并操作源文件。
我们在这边可以先解释一个已经可以解释的问题:既然log.txt和log3.txt指向同一个源文件,为什么删除log3.txt之后,仍然可以访问log.txt?
在Linux编程大全讲解硬链接的内容中有这样一句话:硬链接会一直维持源文件对应的索引节点号来保留数据,直到你删除了最后一个硬链接它的文件。
也就是说,对于存储空间A来说,你删除了log3.txt之后,只是断掉了一个指向它的指针而已,并没有执行删除源文件的操作。
自此,我们讲完了硬链接,其实就是一个指针的概念,硬链接的指针,是指向真实文件的指针,而接下来要讲的软链接,也是一个指针,只不过这个指针指向的是一个地址,该地址也是一个指针,指向真实文件。所以软链接(符号链接),即指针的指针。
上面我们举例说到log.txt代表的是0xA300,这个“0xA300”也需要存在存储空间中,也就是说它也具有一个地址,我们假设为0xA000。那么执行软链接操作:
cp -s log.txt log4.txt之后真实的存储情况长这样。

访问log4.txt时先找到了它代表的0xA000,找到了0xA000存储空间中存储的内容:0xA300,发现它丫的还是一个指针,接着找,找到了存储真实文件的存储空间A。
这里我们可以解释另一个现象,就是为什么删除了log.txt之后,无法访问log4.txt?
这个你自己想吧,中间断掉了,它访问0xA000,嗯,发现里面啥都没有!接着就会告诉你它已经不复存在了,然而你使用ls命令的时候,仍然能看到log4.txt这个文件名,只是无法查看它的内容了。
忠告:
不要觉得软链接和硬链接如此牛逼,就一顿乱用,人家是有使用场合的,比如硬链接,是你在同种媒体介质上不想为相同的内容耗费两份存储空间的时候使用的,而软链接是你想在不同挂载点上使用该文件的时候使用的(即不能在不同挂载点下的文件间创建硬链接)。
如果你一个劲的使用软链接,就会各种断,各种崩。
ln命令
ln命令可以代替cp命令,默认情况下,ln命令会创建硬链接,要加上参数 -s以创建软链接。
Linux 学习笔记 cp 和 ln的更多相关文章
- linux学习笔记22--命令ln
ln是linux中又一个非常重要命令,它的功能是为某一个文件在另外一个位置建立一个同步的链接.当我们需要在不同的目录,用到相同的文件时,我们不需要在每一个需要的目录下都放一个必须相同的文件,我们只要在 ...
- Linux学习笔记--cp命令(复制)
cp:英文名copy,复制的意思. 1. 命令格式: cp [选项] 源文件或文件夹 目标文件或文件夹 cp [选项] 源文件1 源文件2 源文件3 ... 目标文件夹 2. 经常使用选项: &quo ...
- Linux 学习笔记
Linux学习笔记 请切换web视图查看,表格比较大,方法:视图>>web板式视图 博客园不能粘贴图片吗 http://wenku.baidu.com/view/bda1c3067fd53 ...
- deepin linux学习笔记
目录 deepin linux学习笔记 前言 linux常用命令 ls 显示文件夹内容 cd 切换当前目录 pwd 查看当前工作目录 mkdir 新建文件夹 rm 删除文件或文件夹 mv 移动文件 c ...
- Linux 学习笔记之超详细基础linux命令 Part 9
Linux学习笔记之超详细基础linux命令 by:授客 QQ:1033553122 ---------------------------------接Part 8----------------- ...
- 91 Testing Linux学习笔记
91 Testing Linux学习笔记... 学习地址:91Testing 的Linux教程=====================学习网址:http://www.91testing.net/ar ...
- Linux学习笔记(二) 文件管理
了解 Linux 系统基本的文件管理命令可以帮助我们更好的使用 Linux 系统,以下介绍几个常用的文件管理命令 1.pwd pwd 是 Print Working Directory 的简写,用于显 ...
- linux学习笔记2-linux的常用命令
第一篇博客:linux学习笔记1-ubuntu的安装与基本设置 之中,已经介绍了如何安装linux操作系统,以及一些基本的设置修改. 本篇博客主要介绍linux中的一些常用的终端命令 ======== ...
- Linux学习笔记-林耐斯Notes-Linux就该这么学
Linux学习笔记... 参考的优秀Linux网站: http://www.w3cschool.cn/linux/ http://www.linuxeye.com/ http://linux.vbir ...
随机推荐
- asp.net MVC 中@Html.Partial,@Html.Action,@Html.RenderPartial,@Html.RenderAction区别
@Html.Action:需要有对应的Action,并且Action方法有返回值.(注:处理完业务逻辑同时,也需要返回所需值) @{Html.RenderAction}:需要有对应的Action,Ac ...
- The solution to Force.Com IDE 29.0 PassWord Problem
我最近使用Force.com IDE 时,经常提示密码错误.从Google 中终于发现一个解决方法,分享给大家,以供大家参考. 在Force.com IDE 29.0中,IDE 存储我们开发Org ...
- Windwos Server 2008: 当网卡有多个IP地址时,如何指定缺省地址?
这实际是一个当应用向外发起连接时,协议栈对源IP地址的选择问题.如果你的应用没有显式绑定一个本地地址,协议栈会选择一个"最佳"的本地地址来使用. 从 Vista 之后这个选择策略发 ...
- Struts2的输入验证
一.概述: ① Struts2的输入验证 –基于 XWorkValidation Framework的声明式验证:Struts2提供了一些基于 XWork Validation Framework的内 ...
- error LNK1123: 转换到 COFF 期间失败: 文件无效或损坏的解决方案
首先,卸载相关的软件,然后删除所有和virtual studio相关的目录 然后如果还出现该问题,则: Mark一下,解决方法:将嵌入清单设置为"否" 发生场合:在用 C++写一个 ...
- json网页预览插件
- CodeForces 732C Sanatorium (if-else)
题意:某人去旅游,记录了一共吃了多少顿饭,早中晚,但是有可能缺少,问你最少缺少了多少顿. 析:每把三个数排序,然后再一一对比,肯定是以最大数为主,其他两个肯定是缺少了. 代码如下: #pragma c ...
- CLR探索应用程序域世界(上):Windbg SOS剖析揭示域世界
在CLR的世界中,有一系列的令人Amazing的技术和架构.其中,CLR对应用程序在内存中内存分配,执行模型,程序之间的交互等一系列的技术,值得每一个致力于DotNet平台的技术人员深究. 编程人员在 ...
- fedora21发布与新功能介绍(附fedora21安装教程与fedora21下载地址)
fedora21发布与新功能介绍(附fedora21安装教程与fedora21下载地址) 最新的Fedora 21终于正式发布了,Fedora Server 是一款强大可定制化的操作系统,包括了最好最 ...
- 《JavaScript高级程序设计》 读书笔记(三)
操作符 递增和递减操作符 var num1 = 2; var num2 = 20; var num3 = --num1 + num2; // 等于 21 var num4 = num1 + num2; ...