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).实例

  首先展示四种格式创建链接,以便更好的理解四种格式间的差异

[[email protected] ~]$ ls 
公共  模板  视频  图片  文档  下载  音乐  桌面 
[[email protected] ~]$ touch 1 
[[email protected] ~]$ mkdir newDir Dir1 Dir2 
//第一种格式,创建指定名称的目标链接 
[[email protected] ~]$ ln 1 link1 
[[email protected] ~]$ ls -l link1  
-rw-rw-r--. 2 xf xf 0 3月  11 10:51 link1 
//目标和链接都可以使用绝对或相对路径 
[[email protected] ~]$ ln /home/xf/1 ./newDir/link2 
[[email protected] ~]$ ls -l newDir/link2 
-rw-rw-r--. 3 xf xf 0 3月  11 10:51 newDir/link2 
[[email protected] ~]$ cd newDir/ 
[[email protected] newDir]$ ls -l link2  
-rw-rw-r--. 3 xf xf 0 3月  11 10:51 link2 
//第二种格式,在当前目录下创建目标的同名链接 
[[email protected] newDir]$ ln /home/xf/1 
[[email protected] 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 
//第三种格式与第四中格式,在指定目录下创建同名链接 
[[email protected] newDir]$ ln ../1 ../Dir1/ 
[[email protected] newDir]$ ln -t ../Dir2/ ../1 
[[email protected] newDir]$ cd ../Dir1 
[[email protected] Dir1]$ ls -l 
总用量 0 
-rw-rw-r--. 6 xf xf 0 3月  11 10:51 1 
[[email protected] Dir1]$ cd ../Dir2 
[[email protected] Dir2]$ ls -l 
总用量 0 
-rw-rw-r--. 6 xf xf 0 3月  11 10:51 1 
//像控制台不太好看到是否是硬链接,那么可以查看所有文件的inode号 
[[email protected] Dir2]$ stat /home/xf/1 | grep Inode 
设备:803h/2051d	Inode:52016343    硬链接:6 
[[email protected] Dir2]$ stat /home/xf/link1 |grep Inode 
设备:803h/2051d	Inode:52016343    硬链接:6 
[[email protected] Dir2]$ stat /home/xf/newDir/link2 |grep Inode 
设备:803h/2051d	Inode:52016343    硬链接:6 
[[email protected] Dir2]$ stat /home/xf/newDir/1 |grep Inode 
设备:803h/2051d	Inode:52016343    硬链接:6 
[[email protected] Dir2]$ stat /home/xf/Dir1/1 |grep Inode 
设备:803h/2051d	Inode:52016343    硬链接:6 
[[email protected] Dir2]$ stat /home/xf/Dir2/1 |grep Inode 
设备:803h/2051d	Inode:52016343    硬链接:6 

  为文件创建硬链接和软链接

[[email protected] ~]$ touch File  //创建测试文件 
[[email protected] ~]$ ln File link1  //创建硬链接 
[[email protected] ~]$ ln -s File link2  //创建软链接 
[[email protected] ~]$ 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,但修改的其实还是源文件 
[[email protected] ~]$ stat File |grep Inode  //也可使用ls -i File查看 
Device: 803h/2051d	Inode: 52016343    Links: 2 
[[email protected] ~]$ stat link1 |grep Inode 
Device: 803h/2051d	Inode: 52016343    Links: 2 
[[email protected] ~]$ stat link2 |grep Inode 
Device: 803h/2051d	Inode: 52016746    Links: 1 
[[email protected] ~]$ echo aaaa >> link1  //硬链接修改文件数据 
[[email protected] ~]$ cat File  
aaaa 
[[email protected] ~]$ echo aaaa >> link2  //软链接修改文件数据  
[[email protected] ~]$ cat File  
aaaa 
aaaa 
[[email protected] ~]$ 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 
[[email protected] ~]$ chmod +x link2  //软链接修改文件属性 
[[email protected] ~]$ 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 
[[email protected] ~]$ 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 
创建时间:- 
[[email protected] ~]$ 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 
创建时间:- 
//第二个特性,硬链接不能对不存在的文件进行创建,但软链接可以(包括目录文件) 
[[email protected] ~]$ ls 
File  link1  link2  公共  模板  视频  图片  文档  下载  音乐  桌面 
[[email protected] ~]$ ln File1 link3 
ln: failed to access "File1": 没有那个文件或目录 
[[email protected] ~]$ ln -s File1 link4 
[[email protected] ~]$ ls -l link4 
lrwxrwxrwx. 1 xf xf 5 3月  11 11:50 link4 -> File1  //这是一个死链接 
//第三个特性,硬链接不可以跨文件系统(即分区)创建,软链接可以 
[[email protected] ~]$ su - 
密码: 
上一次登录:一 3月 11 13:16:55 CST 2019pts/0 上 
[[email protected] ~]# file -s /dev/sdb1  //查看分区文件系统类型 
/dev/sdb1: SGI XFS filesystem data (blksz 4096, inosz 512, v2 dirs) 
[[email protected] ~]# mount /dev/sdb1 /sdb1  //挂载分区 
[[email protected] ~]# ln /home/xf/File /sdb1/link5  //硬链接无法跨文件系统创建 
ln: 无法创建硬链接"/sdb1/link5" => "/home/xf/File": 无效的跨设备连接 
[[email protected] ~]# ln -s /home/xf/File /sdb1/link6  //软链接可以,但源文件必须是绝对路径,否则为死链接 
[[email protected] ~]# ls -l /sdb1/link6  
lrwxrwxrwx. 1 root root 13 3月  11 13:19 /sdb1/link6 -> /home/xf/File 
//第四个特性,硬链接不能对目录创建链接,但软链接可以 
[[email protected] ~]# exit 
登出 
[[email protected] ~]$ ls 
File  link1  link2  link4  公共  模板  视频  图片  文档  下载  音乐  桌面 
[[email protected] ~]$ mkdir newDir 
[[email protected] ~]$ ln newDir link7 
ln: "newDir": 不允许将硬链接指向目录 
[[email protected] ~]$ ln -s newDir link8 
[[email protected] ~]$ ll link8 
lrwxrwxrwx. 1 xf xf 6 3月  11 13:26 link8 -> newDir 
[[email protected] ~]$ cd link8  //link8可以执行cd命令 
[[email protected] link8]$ 
//第五个特性,删除源文件,硬链接没有影响;软链接变成死链接,但在相同位置重新创建同名文件,软链接变成指向新文件的链接 
[[email protected] link8]$ cd .. 
[[email protected] ~]$ cat File  
aaaa 
aaaa 
[[email protected] ~]$ rm File  //删除源文件 
[[email protected] ~]$ cat link1  //硬链接没有影响 
aaaa 
aaaa 
[[email protected] ~]$ cat link2  //软链接变为死链接 
cat: link2: 没有那个文件或目录 
[[email protected] ~]$ touch File  //相同位置创建同名文件 
[[email protected] ~]$ echo bbbb >> File 
[[email protected] ~]$ cat link1  //硬链接没有影响 
aaaa 
aaaa 
[[email protected] ~]$ cat link2  //软链接指向新建立的同名文件 
bbbb

  如果文件名已存在,可以使用-f选项强制删除已存在的文件

[[email protected] ~]$ touch File link1 
[[email protected] ~]$ ln File link1 
ln: 无法创建硬链接"link1": 文件已存在 
[[email protected] ~]$ ln -f File link1  

  要是不知道文件是否有用,可以使用-b或–backup选项备份已存在的文件。还可使用-S选项指定后缀名。

[[email protected] ~]$ touch File link1 
[[email protected] ~]$ echo aaaa >> link1 
[[email protected] ~]$ ln -bf File link1  //对已存在的同名文件备份 
[[email protected] ~]$ ls  //备份文件默认~结尾 
File  link1  link1~  公共  模板  视频  图片  文档  下载  音乐  桌面 
[[email protected] ~]$ cat link1~ 
aaaa 
[[email protected] ~]$ touch link2 
[[email protected] ~]$ echo bbbb >> link2 
[[email protected] ~]$ ln -bf -S .txt File link2  //指定备份文件的后缀名 
[[email protected] ~]$ ls 
File link1~ link2.txt 模板 图片 下载 桌面 
link1 link2 公共 视频 文档 音乐 
[[email protected] ~]$ 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永远使用普通方式备份(结尾~)。

 

  

原创文章,作者:Maggie-Hunter,如若转载,请注明出处:https://blog.ytso.com/2868.html

(0)
上一篇 2021年7月16日
下一篇 2021年7月16日

相关推荐

发表回复

登录后才能评论