Linux ln 命令 ln
命令是一个非常重要的命令,可以为某一个文件或目录在其他不同的位置建立一个同步的链接。部分功能与Windows的快捷方式类似 。但更加强大。
官方解释为:
ln - make links between files
当我们需要在不同的目录,或者不同的工程,甚至是不同的人员需要用到同一个文件的时候,此时不需要每个位置都通过cp
来拷贝一份,因为在源文件更新的时候,这个文件是不会同步更新的 。而此时ln
命令就不一样了,通过该命令链接到源文件或目录,不仅可以不用占用重复的更多的磁盘空间,还可以同步更新。NICE 。
使用格式 1 $ ln [参数][源文件或目录][目标文件或目录]
其中参数的格式为
-b ,或 like –backup but does not accept an argument
-f
,或 --force
: 强制执行,这个在链接已经存在的情况下必用
-s
,或 --symbolic
:创建符号链接
在Linux文件系统中,又有两种链接类型:
硬链接(hard link)
软链接(symbolic link):又称符号链接,类似于Windows的快捷方式
硬链接会复制一份相同大小的源文件,而软链接是一种特殊的文件,占用很小的磁盘空间。
创建硬链接 默认情况下,不加任何参数,创建的是硬链接,如下,创建源文件a.log 的硬链接a1.log :
1 2 3 4 5 $ ln a.log a1.log $ ll -rw-rw-r--. 3 user user 85710 Apr 5 21:29 a.log -rw-rw-r--. 3 user user 85710 Apr 5 21:29 a1.log
这个时候修改源文件a.log的部分内容,可以看到硬链接也同步更新。
1 2 3 4 5 $ vim a.log $ ll -rw-rw-r--. 3 user user 85716 Apr 5 21:34 a.log -rw-rw-r--. 3 user user 85716 Apr 5 21:34 a1.log
创建软链接 如果需要创建软链接,就需要参数-s
,如下,创建源文件a.log 的软链接a1.log :
1 2 3 4 5 $ ln -s a.log a1.log $ ll -rw-rw-r--. 3 user user 85710 Apr 5 21:29 a.log lrwxrwxrwx. 1 user user 5 Apr 5 21:30 a1.log -> a.log
这个时候修改源文件a.log的部分内容,可以看到软链接没有更新,不过其指向的内容依然更新了。
1 2 3 4 5 $ vim a.log $ ll -rw-rw-r--. 3 user user 85716 Apr 5 21:34 a.log lrwxrwxrwx. 1 user user 5 Apr 5 21:30 a1.log -> a.log
此时可以看到,对于软链接a1.log 而言,其仅为一个符号链接,用file
看一下:
1 2 $ file a1.log a1.log: symbolic link to `a.log'
删除源文件后的情况 此时通过ln创建a.log的硬链接ah.log和软链接as.log,然后看一下如果删除源文件会发生什么情况。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 $ ln a.log ah.log $ ln -s a.log as.log $ ll -rw-rw-r--. 2 user user 85716 Apr 5 21:34 a.log lrwxrwxrwx. 1 user user 5 Apr 5 21:30 as.log -> a.log -rw-rw-r--. 2 user user 85716 Apr 5 21:34 ah.log $ rm a.log $ ll lrwxrwxrwx. 1 user user 5 Apr 5 21:30 as.log -> a.log -rw-rw-r--. 2 user user 85716 Apr 5 21:34 ah.log $ file as.log as.log: broken symbolic link to `a.log'
可以看到如果删除了源文件,硬链接不受影响,但是软链接已经提示链接损坏了。
强制更新软链接 在软链接存在的情况下,如果再创建一个同名的,会报错,此时就需要强制创建了,加上-f
参数即可。
1 2 3 4 5 6 7 8 9 10 11 $ ln -s b.log as.log ln : failed to create symbolic link 'as.log' : File exists$ ln -sf b.log as.log $ ll -rw-rw-r--. 1 user user 85716 Apr 5 22:16 a.log -rw-rw-r--. 2 user user 85716 Apr 5 21:34 ah.log lrwxrwxrwx. 1 user user 5 Apr 5 22:21 as.log -> b.log -rw-rw-r--. 1 user user 85716 Apr 5 22:17 b.log