Linux常用命令-ln

命令

ln

描述

make links between files
创建链接文件

用法

1
2
3
ln [OPTION]... [-T] SOURCE LINK_NAME
ln [OPTION]... SOURCE... DIRECTORY
ln [OPTION]... -t DIRECTORY SOURCE...

选项

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Options:
--backup[=CONTROL] 如果目标已存在则先创建一个备份文件,并指定备份文件名
-b 如果目标已存在则先创建一个备份文件
-f 如果目标已存在则覆盖,强制创建链接文件
-i 如果目标已存在则提示
-P 创建硬链接,默认选项
-r 创建相对路径的软链接,必须配合-s选项使用
-s 创建软链接
-S 指定备份文件名的后缀
-t 指定创建链接的目标目录,用于同时创建多个链接
-v 显示链接详情

CONTROL:
off 不创建备份文件
t 自动创建数字格式的备份文件,每次创建备份时数字自动累加,格式如~1~,~2~
nil 如果已存在数字格式的备份文件则继续创建数字格式的文件,否则使用文件名加~
simple 备份文件使用文件名加~

注意

如果是跨目录创建链接,建议源和目的均使用绝对路径
强烈反对使用嵌套链接,如果链接目录下有其他链接目录,一旦目录结构改变,可能会引起循环嵌套,或者链接失效
删除软链接目录的时候最后一定不要加/,不要使用tab自动补全目录名,否则将会删除源目录下的所有内容,导致数据丢失

硬链接:
1.硬链接不会增加inode值,即与源文件inode值相同,属于同一个文件,只是链接次数依次+1
2.只能对已存在的文件进行创建
3.不能跨驱动器设备或分区创建硬链接
4.硬链接只支持文件,不支持目录
5.删除一个硬链接文件并不影响其他有相同inode值的文件,删除一个链接次数为1的文件则会彻底删除该文件

软连接:
1.软链接相当于创建一个新文件,有自己的文件属性及权限等,链接次数不会增加
2.可对不存在的文件或目录创建软链接
3.软链接可以跨分区建立
4.软链接支持文件或目录
5.软链接相当于快捷方式,推荐使用绝对路径,相对路径的话是相对于软链接的相对路径
6.删除软链接并不影响源文件,如果源文件被删除,则对应的软连接变为死链接,显示为红色,创建或恢复同名源文件,则软连接恢复

示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
$ ll -i
33595980 -rw-r--r-- 1 root root 18 Feb 9 11:06 a
50877596 drwxr-xr-x 2 root root 6 Feb 9 11:06 dir1/
# 创建文件硬链接
$ ln a a1
# 硬链接的inode相同,且ls显示的链接数量变为2
$ ll -i a*
33595980 -rw-r--r-- 2 root root 18 Feb 9 11:06 a
33595980 -rw-r--r-- 2 root root 18 Feb 9 11:06 a1
# s创建文件软链接
$ ln -s a b
# 创建目录软链接
$ ln -s dir1 dir2
# i提示是否覆盖
$ ln -si a b
ln: replace 'b'? y
# v显示详情
$ ln -sv a b
ln: failed to create symbolic link 'b': File exists
# f强制覆盖
$ ln -sfv a b
'b' -> 'a'
# b备份链接文件,默认名称为文件名后加~
$ ln -sb a b
# S指定备份文件后缀.lbak
$ ln -s -S.lbak a b
$ ll b*
lrwxrwxrwx 1 root root 1 Feb 9 12:50 b -> a
lrwxrwxrwx 1 root root 1 Feb 9 12:50 b~ -> a
lrwxrwxrwx 1 root root 1 Feb 9 12:50 b.lbak -> a

# 创建软链接
$ ln -s a dir1/a1
# 创建相对路径的软链接,推荐使用
$ ln -rs a dir1/a2
# 如下软链接a1是有问题的,dir1目录下并没有a这个源文件;a2则正常,因为使用的是相对路径
$ ll dir1
lrwxrwxrwx 1 root root 1 Feb 9 11:56 a1 -> a
lrwxrwxrwx 1 root root 4 Feb 9 11:56 a2 -> ../a
# 使用绝对路径创建软链接
$ ln -s /root/a /tmp/aa
$ ll /tmp/aa
lrwxrwxrwx 1 root root 7 Feb 9 13:30 /tmp/aa -> /root/a

# 同时创建多个链接到一个目录,下面两个命令任选其一
$ mkdir dir2
$ touch a c
# 命令1,目标目录在后
$ ln -srv a c dir2
'dir2/a' -> '../a'
'dir2/c' -> '../c'
$ rm -rf dir2/*
# 或命令2,-t指定目标目录在前
$ ln -srv -t dir2 a c
'dir2/a' -> '../a'
'dir2/c' -> '../c'
$ ll dir2
lrwxrwxrwx 1 root root 4 Feb 9 13:20 a -> ../a
lrwxrwxrwx 1 root root 4 Feb 9 13:20 c -> ../c

# 指定备份文件名格式
$ ln -sv --backup=nil a b
'b' -> 'a'
$ ln -sv --backup=nil a b
'b~' ~ 'b' -> 'a'
# 指定为数字格式名称
$ ln -sv --backup=t a b
'b.~1~' ~ 'b' -> 'a'
# 自动累加
$ ln -sv --backup=t a b
'b.~2~' ~ 'b' -> 'a'
# nil已存在数字格式文件则继续创建数字格式的备份文件
$ ln -sv --backup=nil a b
'b.~3~' ~ 'b' -> 'a'

# 删除软链接目录时目录名称后一定不要加/
$ touch dir1/a
$ mkdir dir1/d1
$ ls dir1/
a d1/
# 创建目录软链接
$ ln -s dir1 dir2
$ ls dir2
a d1/
# 删除软链接时一定要确认提示信息是删除软链接本身,如下
$ rm dir2
rm: remove symbolic link 'dir2'? n
# 如果最后加了/,则表示删除这个目录
$ rm dir2/
rm: cannot remove ‘dir2/’: Is a directory
# 强制删除的话将会删除软链接目录下的所有文件,即源目录下的所有文件,导致数据丢失
$ rm -rf dir2/
$ ls dir1 dir2
dir1:
dir2:

# 链接循环嵌套,一旦目录结构改变,则链接就会失效
$ tree dir*
dir1
├── d1
│   └── aa
└── d2 -> ../dir2/d2
dir2
├── d1 -> ../dir1/d1
└── d2
# 更改dir2名称为dir3
$ mv dir2 dir3
$ tree dir*
dir1
├── d1
│   └── aa
└── d2 -> ../dir2/d2
dir3
├── d1 -> ../dir1/d1
└── d2
# 原有的软链接没变还是dir2,导致链接失效
$ ll dir1
drwxr-xr-x 2 root root 16 Feb 9 14:19 d1/
lrwxrwxrwx 1 root root 10 Feb 9 14:19 d2 -> ../dir2/d2
$ ll dir3
lrwxrwxrwx 1 root root 10 Feb 9 14:19 d1 -> ../dir1/d1/
drwxr-xr-x 2 root root 6 Feb 9 14:18 d2/