linux 连接文件
1 linux 连接文件
Linux有两种连接文件:符号连接(软连接)和硬链接,符号链接类似 Windows 下的快捷方式;硬链接通过文件系统的 inode 连接来产生新文件名,而不是产生新文件。inode:记录文件属性,一个文件一个inode。inode相当于文件ID,查找文件的时候要先找到 inode,然后才能读出文件的内容。
2 ln 命令
ding@ding-ubuntu:~$ ln --help
用法:ln [选项] 源文件 目标文件
必选参数对长短选项同时适用。
-f, --force 强制创建连接文件,如果目标存在,那么先删除掉目标文件,然后再建立连接文件
-s, --symbolic make symbolic links instead of hard links // 创建符号链接
3 硬连接
硬连接是多个文件都指向同一个 inode,硬连接知识点:
a) 具有相同 inode 的多个文件互为硬连接文件,创建硬连接相当于文件实体多了入口;
b) 对于硬连接文件,只有删除了源文件以及对应的所有硬连接文件,文件实体才会被删除;
c) 根据硬连接文件的特点,我们可以通过给文件创建硬连接的方式来防止文件误删除;
ding@ding-ubuntu:~$ ls
hello.c snap 公共的 模板 软件 视频 图片 文档 下载 音乐 桌面
ding@ding-ubuntu:~$ gcc hello.c -o hello // 编译 hello.c 文件
ding@ding-ubuntu:~$ ls
hello hello.c snap 公共的 模板 软件 视频 图片 文档 下载 音乐 桌面
// 对可执行文件 hello 创建硬连接
ding@ding-ubuntu:~$ ln hello hello1
ding@ding-ubuntu:~$ ln hello hello2
ding@ding-ubuntu:~$ ls hello*
hello hello1 hello2 hello.c
ding@ding-ubuntu:~$ ls -l -i hello*
// ls -i 打印 inode,可以看到,硬连接的 inode 值都相同(1573096)
1573096 -rwxr-xr-x 3 ding ding 8304 2月 9 17:36 hello
1573096 -rwxr-xr-x 3 ding ding 8304 2月 9 17:36 hello1
1573096 -rwxr-xr-x 3 ding ding 8304 2月 9 17:36 hello2
1573092 -rw-r--r-- 1 ding ding 125 2月 9 17:30 hello.c
ding@ding-ubuntu:~$ ./hello2 // 硬连接 hello2 能够执行
hello world!
// 删除源文件 hello,硬连接文件依然存在,且能运行
ding@ding-ubuntu:~$ ls
hello1 hello2 hello.c snap 公共的 模板 软件 视频 图片 文档 下载 音乐 桌面
ding@ding-ubuntu:~$ ./hello1 // 硬连接文件能够运行
hello world!
d) 不论修改源文件还是连接文件,另一个文件的数据都会被改变;
ding@ding-ubuntu:~$ ln hello.c hello1.c // 创建 hello.c 的硬连接
ding@ding-ubuntu:~$ gedit hello.c // 修改 hello.c 源文件
ding@ding-ubuntu:~$ cat hello1.c
/* hello.c -- 测试文件 */
#include <stdio.h>
int main(int argc, char argv[])
{
printf("hello world!\r\n");
printf("修改 hello.c 文件\r\n"); // 连接文件 hello1.c 也被修改
return 0;
}
e) 硬连接不能跨文件系统;
f) 硬连接不能连接到目录;
因为以上这些限制,硬连接其实不常用。
4 符号连接(软连接)
符号连接类似 Windows 下的快捷方式,符号连接也叫做软连接。符号连接相当于创建了一个独立的文件,这个文件会让数据读取指向它连接的哪个文件的文件名。软连接的特点:
a) 可以连接到目录; b) 可以跨文件系统;
c) 删除源文件以后,软连接文件也就“打不开了; d) 符号连接文件通过->来指示具体的连接文件;
ding@ding-ubuntu:~$ ln hello hello1 // 创建硬连接
ding@ding-ubuntu:~$ ln -s hello hello2 // 相对路径创建软连接
ding@ding-ubuntu:~$ ln -s /home/ding/hello /home/ding/hello3 // 绝对路径创建软连接
ding@ding-ubuntu:~$ ls -l -i hello*
// 可以看到,硬连接和源文件有相同的 inode,软连接有独立不同的 inode
1572868 -rwxr-xr-x 2 ding ding 8304 2月 9 18:11 hello
1572868 -rwxr-xr-x 2 ding ding 8304 2月 9 18:11 hello1
1573092 lrwxrwxrwx 1 ding ding 5 2月 9 18:24 hello2 -> hello // 相对路径软连接
1573102 lrwxrwxrwx 1 ding ding 16 2月 9 18:24 hello3 -> /home/ding/hello // 绝对路径软连接
1573091 -rw-r--r-- 1 ding ding 163 2月 9 18:10 hello.c
ding@ding-ubuntu:~$ ./hello3 // 软连接一样能运行
hello world!
this is a link-file
注意:符号连接要使用绝对路径,否则连接出问题
在使用 cp 命令拷贝符号连接时,要使用 cp -d 参数,否则会失去符号连接属性;
cp -d:当复制符号连接时,把目标文件或目录也建立为符号连接,并指向与源文件或目录连接的原始文件或目录;
先看一下硬连接和符号连接的文件大小区别:
// 查看文件大小
ding@ding-ubuntu:~$ du -sh hello*
12K hello // 源文件12K
0 hello2 // 符号连接0K,很节省空间
0 hello3
4.0K hello.c
ding@ding-ubuntu:~$ du -sh hello1
12K hello1 // 硬连接和源文件同样大小,12K
以下是使用 cp 命令拷贝文件的过程分析:
ding@ding-ubuntu:~$ cp hello2 test/ // 常规拷贝
ding@ding-ubuntu:~$ cp -d hello2 test/hello2-d // 符号连接拷贝
// 文件类型的区别:
ding@ding-ubuntu:~/test$ ls -l
总用量 12
// 常规拷贝,将 hello2 这个符号连接拷贝成了 可执行文件
-rwxr-xr-x 1 ding ding 8304 2月 9 18:46 hello2
// -d 拷贝,保持了符号连接属性
lrwxrwxrwx 1 ding ding 5 2月 9 18:46 hello2-d -> hello
// 文件大小
ding@ding-ubuntu:~/test$ du -sh hello2*
12K hello2 // 直接拷贝了整个文件
0 hello2-d // 相对路径符号连接
这里可以看到,cp 一个符号连接,会完成的拷贝源文件,而 cp -d 才会保持文件的符号连接属性。
下面是使用相对路径和绝对路径的拷贝过程:
ding@ding-ubuntu:~$ cp -d hello3 test/hello3-d // 绝对路径 -d 拷贝
// 文件类型属性
ding@ding-ubuntu:~/test$ ls -l
总用量 12
-rwxr-xr-x 1 ding ding 8304 2月 9 18:46 hello2
lrwxrwxrwx 1 ding ding 5 2月 9 18:46 hello2-d -> hello // 指向相对路径
lrwxrwxrwx 1 ding ding 16 2月 9 18:52 hello3-d -> /home/ding/hello // 指向绝对路径
// 文件大小属性
ding@ding-ubuntu:~/test$ du -sh hello*
12K hello2 // 常规拷贝
0 hello2-d // 相对路径 -d 拷贝
0 hello3-d // 绝对路径 -d 拷贝
// 可执行属性
ding@ding-ubuntu:~/test$ ls
hello2 hello2-d hello3-d
ding@ding-ubuntu:~/test$ ./hello2-d // 相对路径的符号连接,拷贝后无法执行
bash: ./hello2-d: 没有那个文件或目录
ding@ding-ubuntu:~/test$ ./hello3-d
hello world! // 绝对路径的符号连接,拷贝后能够执行
this is a link-file