Linux命令之ln
ln [选项] … [-T] 目标 链接名 (第一种格式)
ln [选项] … 目标 (第二种格式)
ln [选项] … 目标 … 目录 (第三种格式)
ln [选项] … -t 目录 目标 … (第四种格式)
在第一种格式中,创建指定名称且指向指定目标的链接。
在第二种格式中,在当前目录创建指向目标位置的同名链接。
在第三第四种格式中,在指定目录中创建指定目标的同名链接。
默认创建硬链接。创建软链接(符号链接)时必须使用使用-s或--symbolic选项。
注意:同一位置不能出现相同的文件名。创建链接时需要注意软硬链接的特性。
硬链接与软链接详见:硬链接与软链接
(1).选项
--backup[=CONTROL] 为每个已存在的目的地文件(链接同地址同名文件)创建备份文件 -b 类似--backup,但不接受任何参数 -d,-F,--directory 创建指向目录的硬链接(只适用于超级用户) -f,--force 强行删除任何已存在的目标文件 -i,--interactive 删除文件前进行确认 -L,--logical 将硬链接创建为符号链接引用 -n,--no-dereference 如果目的地是一个链接至某目录的符号链接,会将该符号链接当作普通文件处理,先将该已存在的链接备份或删除 -s,--symbolic 创建符号链接而非硬链接 -S,--suffix=后缀 自行指定备份文件的后缀 -t,--target-directory=目录 在指定目录中创建链接 -T,--no-target-directory 将链接名称当作普通文件 -v,--erbose 链接前先列出每个文件的名称
(2).实例
首先展示四种格式创建链接,以便更好的理解四种格式间的差异
[xf@xuexi ~]$ ls 公共 模板 视频 图片 文档 下载 音乐 桌面 [xf@xuexi ~]$ touch 1 [xf@xuexi ~]$ mkdir newDir Dir1 Dir2 //第一种格式,创建指定名称的目标链接 [xf@xuexi ~]$ ln 1 link1 [xf@xuexi ~]$ ls -l link1 -rw-rw-r--. 2 xf xf 0 3月 11 10:51 link1 //目标和链接都可以使用绝对或相对路径 [xf@xuexi ~]$ ln /home/xf/1 ./newDir/link2 [xf@xuexi ~]$ ls -l newDir/link2 -rw-rw-r--. 3 xf xf 0 3月 11 10:51 newDir/link2 [xf@xuexi ~]$ cd newDir/ [xf@xuexi newDir]$ ls -l link2 -rw-rw-r--. 3 xf xf 0 3月 11 10:51 link2 //第二种格式,在当前目录下创建目标的同名链接 [xf@xuexi newDir]$ ln /home/xf/1 [xf@xuexi newDir]$ ls -l 总用量 0 -rw-rw-r--. 4 xf xf 0 3月 11 10:51 1 -rw-rw-r--. 4 xf xf 0 3月 11 10:51 link2 //第三种格式与第四中格式,在指定目录下创建同名链接 [xf@xuexi newDir]$ ln ../1 ../Dir1/ [xf@xuexi newDir]$ ln -t ../Dir2/ ../1 [xf@xuexi newDir]$ cd ../Dir1 [xf@xuexi Dir1]$ ls -l 总用量 0 -rw-rw-r--. 6 xf xf 0 3月 11 10:51 1 [xf@xuexi Dir1]$ cd ../Dir2 [xf@xuexi Dir2]$ ls -l 总用量 0 -rw-rw-r--. 6 xf xf 0 3月 11 10:51 1 //像控制台不太好看到是否是硬链接,那么可以查看所有文件的inode号 [xf@xuexi Dir2]$ stat /home/xf/1 | grep Inode 设备:803h/2051d Inode:52016343 硬链接:6 [xf@xuexi Dir2]$ stat /home/xf/link1 |grep Inode 设备:803h/2051d Inode:52016343 硬链接:6 [xf@xuexi Dir2]$ stat /home/xf/newDir/link2 |grep Inode 设备:803h/2051d Inode:52016343 硬链接:6 [xf@xuexi Dir2]$ stat /home/xf/newDir/1 |grep Inode 设备:803h/2051d Inode:52016343 硬链接:6 [xf@xuexi Dir2]$ stat /home/xf/Dir1/1 |grep Inode 设备:803h/2051d Inode:52016343 硬链接:6 [xf@xuexi Dir2]$ stat /home/xf/Dir2/1 |grep Inode 设备:803h/2051d Inode:52016343 硬链接:6
为文件创建硬链接和软链接
[xf@xuexi ~]$ touch File //创建测试文件 [xf@xuexi ~]$ ln File link1 //创建硬链接 [xf@xuexi ~]$ ln -s File link2 //创建软链接 [xf@xuexi ~]$ ls -l link* -rw-rw-r--. 2 xf xf 0 Mar 11 11:33 link1 lrwxrwxrwx. 1 xf xf 4 Mar 11 11:33 link2 -> File
根据硬链接与软链接的特性,比较差异
//第一个特性,硬链接与源文件具有相同inode号和data block,修改文件属性或文件数据会应影响所有硬链接(包括源文件); //软链接虽然有自己的inode号和data block,但修改的其实还是源文件 [xf@xuexi ~]$ stat File |grep Inode //也可使用ls -i File查看 Device: 803h/2051d Inode: 52016343 Links: 2 [xf@xuexi ~]$ stat link1 |grep Inode Device: 803h/2051d Inode: 52016343 Links: 2 [xf@xuexi ~]$ stat link2 |grep Inode Device: 803h/2051d Inode: 52016746 Links: 1 [xf@xuexi ~]$ echo aaaa >> link1 //硬链接修改文件数据 [xf@xuexi ~]$ cat File aaaa [xf@xuexi ~]$ echo aaaa >> link2 //软链接修改文件数据 [xf@xuexi ~]$ cat File aaaa aaaa [xf@xuexi ~]$ ll File link2 -rw-rw-r--. 2 xf xf 0 3月 11 14:27 File lrwxrwxrwx. 1 xf xf 4 3月 11 14:28 link2 -> File [xf@xuexi ~]$ chmod +x link2 //软链接修改文件属性 [xf@xuexi ~]$ ll File link2 -rwxrwxr-x. 2 xf xf 0 3月 11 14:27 File lrwxrwxrwx. 1 xf xf 4 3月 11 14:28 link2 -> File [xf@xuexi ~]$ stat File 文件:"File" 大小:0 块:0 IO 块:4096 普通空文件 设备:803h/2051d Inode:52016343 硬链接:2 权限:(0775/-rwxrwxr-x) Uid:( 1000/ xf) Gid:( 1000/ xf) 环境:unconfined_u:object_r:user_home_t:s0 最近访问:2019-03-11 14:27:29.750638827 +0800 最近更改:2019-03-11 14:27:29.750638827 +0800 最近改动:2019-03-11 14:38:22.936661898 +0800 创建时间:- [xf@xuexi ~]$ stat link2 文件:"link2" -> "File" 大小:4 块:0 IO 块:4096 符号链接 设备:803h/2051d Inode:52016746 硬链接:1 权限:(0777/lrwxrwxrwx) Uid:( 1000/ xf) Gid:( 1000/ xf) 环境:unconfined_u:object_r:user_home_t:s0 最近访问:2019-03-11 14:28:37.354054265 +0800 最近更改:2019-03-11 14:28:37.353054303 +0800 最近改动:2019-03-11 14:28:37.353054303 +0800 创建时间:- //第二个特性,硬链接不能对不存在的文件进行创建,但软链接可以(包括目录文件) [xf@xuexi ~]$ ls File link1 link2 公共 模板 视频 图片 文档 下载 音乐 桌面 [xf@xuexi ~]$ ln File1 link3 ln: failed to access "File1": 没有那个文件或目录 [xf@xuexi ~]$ ln -s File1 link4 [xf@xuexi ~]$ ls -l link4 lrwxrwxrwx. 1 xf xf 5 3月 11 11:50 link4 -> File1 //这是一个死链接 //第三个特性,硬链接不可以跨文件系统(即分区)创建,软链接可以 [xf@xuexi ~]$ su - 密码: 上一次登录:一 3月 11 13:16:55 CST 2019pts/0 上 [root@xuexi ~]# file -s /dev/sdb1 //查看分区文件系统类型 /dev/sdb1: SGI XFS filesystem data (blksz 4096, inosz 512, v2 dirs) [root@xuexi ~]# mount /dev/sdb1 /sdb1 //挂载分区 [root@xuexi ~]# ln /home/xf/File /sdb1/link5 //硬链接无法跨文件系统创建 ln: 无法创建硬链接"/sdb1/link5" => "/home/xf/File": 无效的跨设备连接 [root@xuexi ~]# ln -s /home/xf/File /sdb1/link6 //软链接可以,但源文件必须是绝对路径,否则为死链接 [root@xuexi ~]# ls -l /sdb1/link6 lrwxrwxrwx. 1 root root 13 3月 11 13:19 /sdb1/link6 -> /home/xf/File //第四个特性,硬链接不能对目录创建链接,但软链接可以 [root@xuexi ~]# exit 登出 [xf@xuexi ~]$ ls File link1 link2 link4 公共 模板 视频 图片 文档 下载 音乐 桌面 [xf@xuexi ~]$ mkdir newDir [xf@xuexi ~]$ ln newDir link7 ln: "newDir": 不允许将硬链接指向目录 [xf@xuexi ~]$ ln -s newDir link8 [xf@xuexi ~]$ ll link8 lrwxrwxrwx. 1 xf xf 6 3月 11 13:26 link8 -> newDir [xf@xuexi ~]$ cd link8 //link8可以执行cd命令 [xf@xuexi link8]$ //第五个特性,删除源文件,硬链接没有影响;软链接变成死链接,但在相同位置重新创建同名文件,软链接变成指向新文件的链接 [xf@xuexi link8]$ cd .. [xf@xuexi ~]$ cat File aaaa aaaa [xf@xuexi ~]$ rm File //删除源文件 [xf@xuexi ~]$ cat link1 //硬链接没有影响 aaaa aaaa [xf@xuexi ~]$ cat link2 //软链接变为死链接 cat: link2: 没有那个文件或目录 [xf@xuexi ~]$ touch File //相同位置创建同名文件 [xf@xuexi ~]$ echo bbbb >> File [xf@xuexi ~]$ cat link1 //硬链接没有影响 aaaa aaaa [xf@xuexi ~]$ cat link2 //软链接指向新建立的同名文件 bbbb
如果文件名已存在,可以使用-f选项强制删除已存在的文件
[xf@xuexi ~]$ touch File link1 [xf@xuexi ~]$ ln File link1 ln: 无法创建硬链接"link1": 文件已存在 [xf@xuexi ~]$ ln -f File link1
要是不知道文件是否有用,可以使用-b或--backup选项备份已存在的文件。还可使用-S选项指定后缀名。
[xf@xuexi ~]$ touch File link1 [xf@xuexi ~]$ echo aaaa >> link1 [xf@xuexi ~]$ ln -bf File link1 //对已存在的同名文件备份 [xf@xuexi ~]$ ls //备份文件默认~结尾 File link1 link1~ 公共 模板 视频 图片 文档 下载 音乐 桌面 [xf@xuexi ~]$ cat link1~ aaaa [xf@xuexi ~]$ touch link2 [xf@xuexi ~]$ echo bbbb >> link2 [xf@xuexi ~]$ ln -bf -S .txt File link2 //指定备份文件的后缀名 [xf@xuexi ~]$ ls File link1~ link2.txt 模板 图片 下载 桌面 link1 link2 公共 视频 文档 音乐 [xf@xuexi ~]$ cat link2.txt bbbb
另外说明一下backup的有效值:none和off这两个值是不进行备份;numbered和t这两个值是备份文件加上数值,例如文件link3,备份后是link3.~1~;existing和nil这两个值是如有数字备份文件则使用数字,否则使用普通方式备份,例如使用有效值t已经备份过一次的link3,此时存在硬链接link3与备份文件link3.~1~,那么再使用有效值nil时会生成一个新的link3,原有的硬链接link3被备份为link3.~2~;simple和never永远使用普通方式备份(结尾~)。